gpt4 book ai didi

c++ - while 循环条件变量

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:00 25 4
gpt4 key购买 nike

在下面的例子中,我不明白ready的用意。在此示例中使用或不使用 ready 有什么区别?

#include <iostream>           // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id (int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) cv.wait(lck);
// ...
std::cout << "thread " << id << '\n';
}

void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
}

int main ()
{
std::thread threads[10];
// spawn 10 threads:
for (int i=0; i<10; ++i)
threads[i] = std::thread(print_id,i);

std::cout << "10 threads ready to race...\n";
go(); // go!

for (auto& th : threads) th.join();

return 0;
}

最佳答案

原因是 cv.wait(lck); 可以在 调用 notify_all 之前返回,因为名为“虚假唤醒”。可以看到Spurious wakeups explanation sounds like a bug that just isn't worth fixing, is that right?有关此原因的更多信息。

因此,等待/通知线程使用额外的谓词(在本例中为 ready)来指示条件是否已发出信号或条件是否由于虚假唤醒而唤醒。

关于c++ - while 循环条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53347124/

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