我正在测试边缘情况,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)