gpt4 book ai didi

c++ - 多次调用 std::condition_variable::notify_one() 而不进行上下文切换

转载 作者:行者123 更新时间:2023-11-30 01:23:22 25 4
gpt4 key购买 nike

本例中有多少等待线程会被唤醒:

第一个线程:

void wakeUp2Threads()
{
std::unique_lock<std::mutex> lock(condvar_mutex);

condvar.notify_one();
condvar.notify_one();
}

第二个线程:

{
std::unique_lock<std::mutex> lock(condvar_mutex);

condvar.wait(lock); <- 2nd thread has entered here before 1st thread entered wakeUp2Threads.
}

第三线程(与第二线程相同):

{
std::unique_lock<std::mutex> lock(condvar_mutex);

condvar.wait(lock); <- 3rd thread has entered here before 1st thread entered wakeUp2Threads.
}

是否可以保证在此示例中,两个通知将多次传递到不同的线程,而不是同一个线程?

即 notify_one() 是什么意思:

1) notify one thread, no matter has it been already notified (but has not been woken up yet), or not. (* see note)
or
2) notify one thread, but only this one, which has not been notified yet.

(*) 注意! 我在这里不是在谈论“等待线程已经在过去某个地方得到通知,被唤醒,做了一些事情并再次进入 condvar.wait()”的场景"- 当然,在这种情况下,多个 notify_one() 例程可以一遍又一遍地唤醒同一个线程。

我说的是另一个案例:

notify_one() 已通知等待线程唤醒,但在该等待线程从内核调度程序接收到时隙并继续执行之前 - 另一个 notify_one() 已被再次调用。 第二个通知是否有可能再次传送到同一个线程,而它还没有从第一个通知中唤醒?

最佳答案

notify_one 调用以原子方式取消阻塞一个线程。这意味着当第二次调用时,它无法取消阻塞同一个线程,因为它不再被阻塞。

这在标准第 30.5/3 和 30.5.1/7 节中有规定。

关于c++ - 多次调用 std::condition_variable::notify_one() 而不进行上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085823/

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