允许多个互斥锁所有者或指定数量的并发代码执行
Allow multiple mutex owners or specified number of concurrent code executions
有一个代码我不想一次由超过X个线程(例如五个(执行。每个较小的数字都可以。我目前正在试验条件变量,这是我到目前为止得出的结果:
void Manager::EnterQueue(Worker *w)
{
{
// Ensure stable work of std::queue
const std::lock_guard<std::mutex> lock(queueInsertMutex);
workerQueue.push(w);
}
std::unique_lock<std::mutex> unlock_object(queueMutex);
while (workerQueue.front() != w)
{
// stop all threads not being at front of queue
cv.wait(unlock_object);
}
workerQueue.pop();
{
// ensure that numOfAvailableObjects is checked by one thread at a time
const std::lock_guard<std::mutex> lock(counterMutex);
if (numOfAvailableObjects > 1)
{
// limit is not exceeded. Fire up another thread
numOfAvailableObjects--;
cv.notify_all();
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(SOME_WORK_TIME_IN_MS));
{
const std::lock_guard<std::mutex> lock(counterMutex);
numOfAvailableObjects++;
}
cv.notify_all();
}
所以这个想法是:
- 创建仅传递队列中第一个工作线程
while
循环 - 如果
numOfAvailableObjects > 1
则通过调用cv.notify_all()
传递下一个工作线程,该 (理论上(将恢复所有cv.wait(unlock_object)
.
当然,它不会按预期工作。sleep_for
当前由一个线程一次执行。您是否知道任何其他替代方案可以像cv.wait()
一样工作,它会停止线程,直到我告诉它们恢复?
我想你正在寻找信号量。查一查。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 控制允许动态运行c++的并发操作数
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 防止一段代码在协程中并发执行
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- 对一部分文本执行并发mmap()
- MFC:当进程在win32文本区域(MFC应用程序)中执行时,异步(并发)显示进程的输出
- 线程执行的例子在c++并发的行动
- c++并发、同步设计,避免多次执行问题
- 如何告诉c++并发运行时重用前一个线程来执行任务