gpt4 book ai didi

c++ - 并非所有线程都收到 condition_variable.notify_all() 的通知

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

我有以下场景:

condition_variable cv;
mutex mut;

// Thread 1:
void run() {
while (true) {
mut.lock();
// create_some_data();
mut.unlock();
cv.notify_all();
}
}

// Thread 2
void thread2() {
mutex lockMutex;
unique_lock<mutex> lock(lockMutex);
while (running) {
cv.wait(lock);
mut.lock();
// copy data
mut.unlock();
// process data
}
}

// Thread 3, 4... - same as Thread 2

我一直运行线程 1 以获取新数据。其他线程等待 condition_variable 直到有新数据可用,然后复制它并对其进行一些处理。线程执行的工作在完成所需的时间上有所不同,其思想是线程只有在完成旧数据时才会获取新数据。在此期间得到的数据允许“遗漏”。我不使用共享互斥量(仅用于访问数据),因为我不希望线程相互依赖。

上面的代码在 Windows 上运行良好,但现在我在 Ubuntu 上运行它,我注意到当调用 notify_all() 时只有一个线程被通知,而其他线程只是卡在 wait() 上。这是为什么? Linux 是否需要不同的方法来使用 condition_variable?

最佳答案

您的代码会立即显示 UB,因为它会重新锁定 cv 在退出等待时重新锁定的唯一锁。

还有其他问题,比如没有检测到虚假唤醒。

最后 cv 通知所有 onky 通知的当前等待线程。如果稍后出现一个线程,则没有骰子。

关于c++ - 并非所有线程都收到 condition_variable.notify_all() 的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38184549/

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