c++ - 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - 在 C++ 中吗?

标签 c++ multithreading notifications yield

产量():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() 是等价的吗?

最佳答案

yieldnotify_one 无关。

yield 是一个进程请求(向操作系统)放弃其当前时间片。下一次仍会安排线程。想象一下,一个进程被分配了 10ms。如果它在 5 毫秒后调用 yield,操作系统可以运行另一个进程。下次轮到它运行时,它仍然会得到完整的 10 毫秒。操作系统不必满足请求。

condition_variable::notify_onecondition_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 need yield()

如果线程 A 刚刚用 nofity_one 唤醒了线程 C,而你希望尽快运行线程 C,你可以调用 yield 放弃线程 A 的其余部分时间片。但是,操作系统不需要批准您的请求。并且可能有许多线程安排在您无法控制的线程 C 之前。

关于c++ - 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - 在 C++ 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550090/

相关文章:

java - 在 Android 上显示保存的接近警报?

mysql - 减少通知系统上的数据库写入或更改认可的数据库?

c# - Sharepoint 2010 更新的远程通知?

c# - 并发多线程读取访问 - 这会导致任何问题吗?

c++ - 需要有关此文本消息解码器 (C++) 练习的帮助

c++ - 使用 C++ 创建独立的 Solidworks 应用程序

c++ - OpenGL 2d 纹理渲染问题

python - threading.Thread 对抗 multiprocessing.Process

java - 等待并通知 需要解释

c++ - 在 C++ 中删除全局分配的内存