产量():https://en.cppreference.com/w/cpp/thread/yield
notify_one():http://www.cplusplus.com/reference/condition_variable/condition_variable/notify_one/
案例:
线程 A 应该完成它正在做的任何事情,然后唤醒线程 B 来完成它的工作。
我在线程 A 的 run() 函数中写了一个 notify_one() 调用。
是否有可能线程 A 发出 notify_one() 信号,但即使线程 B 已准备就绪,线程 A 仍会再次被调度?
notify_one() 和 yield() 是等价的吗?
最佳答案
yield
和 notify_one
无关。
yield
是一个进程请求(向操作系统)放弃其当前时间片。下一次仍会安排线程。想象一下,一个进程被分配了 10ms。如果它在 5 毫秒后调用 yield
,操作系统可以运行另一个进程。下次轮到它运行时,它仍然会得到完整的 10 毫秒。操作系统不必满足请求。
condition_variable::notify_one
与 condition_variable::wait
结合使用。如果有任何线程在等待,notify_one 保证唤醒其中之一。如果没有线程在等待,notify_one 将不执行任何操作。
请注意,条件变量在调用 wait 时必须与 1 个保护共享状态(条件)的互斥锁一起使用,并且它正在等待另一个线程在条件为真时发出信号.
Is a case possible that thread A signals notify_one() but still thread A is scheduled again even though thread B is ready?
是的。使用 Mesa 语义,向等待线程发出信号只会解除对另一个线程的阻塞。当前线程可能会继续运行,直到超时。使用 Hoare 语义,发信号的线程将立即切换到等待线程。然而,几乎所有条件的实现都使用 Mesa 语义。
Are notify_one() and yield() equivalent of each other?
“等效”意味着它们做同样的事情。事实并非如此。我想你的意思是问它们是否互补,或者它们是否属于同一同步方案,答案是否定的,正如我上面所解释的。
If we use
notify_one()
to wake a thread, do we still needyield()
如果线程 A 刚刚用 nofity_one
唤醒了线程 C,而你希望尽快运行线程 C,你可以调用 yield
放弃线程 A 的其余部分时间片。但是,操作系统不需要批准您的请求。并且可能有许多线程安排在您无法控制的线程 C 之前。
关于c++ - 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - 在 C++ 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550090/