允许多个互斥锁所有者或指定数量的并发代码执行

Allow multiple mutex owners or specified number of concurrent code executions

本文关键字:并发 执行 代码 许多个 所有者      更新时间:2023-10-16

有一个代码我不想一次由超过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()一样工作,它会停止线程,直到我告诉它们恢复?

我想你正在寻找信号量。查一查。