gpt4 book ai didi

c++ - 了解 std::condition_variables

转载 作者:太空狗 更新时间:2023-10-29 20:38:05 26 4
gpt4 key购买 nike

当我有多个线程等待执行时,我试图了解 condition_variable 的流程。据我了解,所有线程都会尝试获取唯一锁,一个线程会获取它,然后进入 wait(),如果您调用 notify_all,最多不会有一个线程等待被允许通过。直到它释放它的锁并允许其他线程通过。

cv 是否与唯一锁通信,让所有线程一次全部通过?如果是这样,是真的一次全部通过还是线程一个接一个地依次通过。

std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
// 1) to synchronize accesses to i
// 2) to synchronize accesses to std::cerr
// 3) for the condition variable cv
int i = 0;

void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
std::cerr << "Waiting... \n";
cv.wait(lk, []{return i == 1;});
std::cerr << "...finished waiting. i == 1\n";
}

http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all

最佳答案

当您调用 wait 时(单参数版本)锁被解锁,线程进入等待状态,直到 CV 被“通知”。当一个线程唤醒时,锁再次被锁定。

当您调用 notify_one 时,基本上会通知等待 CV 的随机线程。当您调用 notify_all所有等待 CV 的线程将从等待状态中唤醒,第一个锁定锁的线程将是继续的线程。 哪个也是随机的。

请注意,当我说“随机”时,您系统上线程的实际实现(从 C++ 库到操作系统内核,甚至可能是硬件)可能以某种方式实现,从而可以推断出哪个线程将被唤醒并获得锁,但从我们使用条件变量的应用程序编写者的角度来看,没有预先确定的顺序,它是随机的。

关于c++ - 了解 std::condition_variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776786/

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