gpt4 book ai didi

C++ - 不同线程通知的 std::condition_variable

转载 作者:行者123 更新时间:2023-11-30 04:59:31 26 4
gpt4 key购买 nike

我正在尝试从两个不同的线程通知一个事件。主线程在第一次调用 notify_one() 时唤醒,但在第二次调用时没有。这是使用条件变量的正确方法吗?

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

bool is_ready_1(false);
bool is_ready_2(false);
std::mutex m;
std::condition_variable cv;

void test1()
{
std::this_thread::sleep_for(std::chrono::seconds(3));
std::unique_lock<std::mutex> lk(m);
is_ready_1 = true;
cv.notify_one();
}
void test2()
{
std::this_thread::sleep_for(std::chrono::seconds(6));
std::unique_lock<std::mutex> lk(m);
is_ready_2 = true;
cv.notify_one();
}

int main()
{
std::thread t1(test1);
std::thread t2(test2);

std::unique_lock<std::mutex> lk(m);
while (!is_ready_1)
{
cv.wait(lk);
if (is_ready_1)
std::cout << "Spurious wake-1 up!\n";
}

while (!is_ready_2)
{
cv.wait(lk);
if (is_ready_2)
std::cout << "Spurious wake-2 up!\n";
}
t1.join();
t2.join();
system("pause");
}

最佳答案

试试这段代码。请注意,条件变量接受一个谓词,该谓词首先检查条件是否满足,然后获取锁。当您通知变量时,它运行谓词(不获取锁),如果条件为真,线程将拥有锁,否则调用线程将继续等待下一个通知。

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

auto is_ready_1=false;
auto is_ready_2=false;
std::mutex m;
std::condition_variable cv;

void test1()
{
std::this_thread::sleep_for(std::chrono::seconds(3));
std::unique_lock<std::mutex> lk(m);
is_ready_1 = true;
cv.notify_one();
}
void test2()
{
std::this_thread::sleep_for(std::chrono::seconds(6));
std::unique_lock<std::mutex> lk(m);
is_ready_2 = true;
cv.notify_one();
}

int main()
{
std::thread t1(test1);
std::thread t2(test2);

std::unique_lock<std::mutex> lk(m);
cv.wait(lk, [] {
if (!is_ready_1)
{
std::cout << "Spurious 1" << std::endl;
}
return is_ready_1;
});
//preceding line must clear before this is executed
cv.wait(lk, [] {
if (!is_ready_2)
{
std::cout << "Spurious 1" << std::endl;
}
return is_ready_2;
});

t1.join();
t2.join();
system("pause");
}

同样在 Windows 10 上,我看到两个虚假的唤醒事件,我怀疑这些是在线程从 sleep 中唤醒时发生的。

关于C++ - 不同线程通知的 std::condition_variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174191/

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