小编Piw*_*zne的帖子

条件变量notify_one是否会继续尝试,直到到达正在等待肯定谓词的线程?

我正在测试边缘情况,std::condition_variable并测试了使一个线程挨饿的场景。场景是有 99 个生产者和只有 1 个消费者,所有这些生产者都在 1 个最大大小的队列上工作。notify_one(达到队列最大大小后)命中消费者的概率接近 1%。因此,这意味着它将命中另一个生产者,该生产者将检查谓词,然后等待互斥体。

我预计程序会在此时挂起,但我看到的是程序尝试了尽可能多的谓词,直到最终到达消费者。如果没有消费者,则永远在所有等待线程中检查谓词。

我的问题是:标准是否定义了notify_one()将尝试通知第一个具有正谓词结果的等待线程?那么为什么它可以在没有预测的情况下与消费者一起工作(注释代码)。或者这是一个虚假的唤醒,它正在努力唤醒我的等待线程?或者是其他东西?

在 Windows 上使用 Clang 和 MSVC 进行了测试。

我的代码重现该案例:

#include <condition_variable>
#include <mutex>
#include <queue>
#include <vector>
#include <iostream>

class CVSimple
{

public:
    static void test() {
        std::queue<int> que;
        std::mutex m;
        std::condition_variable cv;
        int max_size = 10;
        bool working = true;


        auto producer = [&]() {
            while (working) {
                std::unique_lock<std::mutex> lock(m);
                std::chrono::milliseconds t(200);
                auto predicate = [&que, &max_size]() { 
                    if (que.size() < max_size) {
                        std::cout << "T";
                        return true; …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex stdthread conditional-variable

6
推荐指数
1
解决办法
162
查看次数