gpt4 book ai didi

c++ - 丢失唤醒 : What if the producer acquires the mutex first?

转载 作者:行者123 更新时间:2023-12-03 12:48:42 27 4
gpt4 key购买 nike

我试图理解使用条件变量时丢失唤醒的问题。我相信我已经使用了下面正确的设计模式。消费者:

lock the mutex
while the condition is not satisfied
wait on the condition variable
consume
unlock the mutex

和制作人:

lock the mutex
produce
unlock the mutex
signal the condition variable (notify consumer)

我的问题是这样的:如果消费者首先获取互斥体,那就没问题了——直到消费者在 wait() 释放互斥体之前,生产者将无法获取互斥体,因此生产者将无法获取互斥体。无法在消费者实际等待之前通知()。 但是如果生产者在消费者之前获取互斥体怎么办?然后它可以在消费者等待之前使用notify()。据我了解,下面的代码没有解决这个问题。有人可以验证这一点吗?如果实际上不存在,如何才能绝对保证不存在丢失唤醒的问题?

#include <iostream>
#include <thread>
#include <mutex>
#include <thread>
#include <condition_variable>

using namespace std;

class Foo {
mutex m;
condition_variable cv;
bool consumerReady;

public:
Foo() {
consumerReady = false;
}

void producer() {
{
unique_lock<mutex> ul(m);
cout << "produced"<<endl;
consumerReady = true;
}
cv.notify_one();
}

void consumer() {
unique_lock<mutex> ul(m);
cv.wait(ul, [this]{ return consumerReady; });
cout<<"consumed"<<endl;
consumerReady = false;
}
};

int main() {
Foo* z = new Foo();

thread t1(&Foo::producer, z);
thread t2(&Foo::consumer, z);

t1.join();
t2.join();

return 0;
}

最佳答案

But what if the producer acquires the mutex before the consumer? Then it could notify() before the consumer is waiting.

没问题。您的 cv.wait(ul, [this]{ return ConsumerReady; });

相同
while(not consumerReady) cv.wait(ul)

因此,首先检查实际的 consumerReady 变量,只有在未设置该变量时才会进入等待模式。

关于c++ - 丢失唤醒 : What if the producer acquires the mutex first?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66337765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com