首页 > 解决方案 > 允许多个互斥体所有者或指定数量的并发代码执行

问题描述

有一个代码我不想一次被超过 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();
}

所以这个想法是:

当然,它不会按预期工作。sleep_for当前一次由一个线程执行。您是否知道任何其他可以像这样工作的替代方案cv.wait()会停止线程,直到我告诉它们恢复?

标签: c++multithreading

解决方案


我认为您正在寻找信号量。查一下。


推荐阅读