c++ - 允许多个互斥体所有者或指定数量的并发代码执行
问题描述
有一个代码我不想一次被超过 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()
which (理论上)将恢复所有cv.wait(unlock_object)
.
当然,它不会按预期工作。sleep_for
当前一次由一个线程执行。您是否知道任何其他可以像这样工作的替代方案cv.wait()
会停止线程,直到我告诉它们恢复?
解决方案
我认为您正在寻找信号量。查一下。
推荐阅读
- javascript - 如何向我的子域基础网络站点显示自定义帖子?
- javascript - $element 的 offsetHeight 在不应该被事件捕获时变为 0
- java - 无法从 java 连接到 hbase
- unit-testing - 在 Grails 中编写超级简单测试的问题
- javascript - html javascript获取div中的长度名称
- scala - 映射查询值后的Scala Slick过滤器
- java - 虽然变量已被初始化,但我得到可能未初始化错误
- custom-data-attribute - 如何使用 Asciidoctor 添加自定义数据属性?
- c# - C# 如何并行化 IEnumerable 的 IEnumerable?
- c++ - C++多线程中的锁和条件变量问题