代码之家  ›  专栏  ›  技术社区  ›  Aquarius_Girl

如果我们使用NoTyjyOne()来唤醒线程,那么我们仍然需要C++中的屈服()吗?

  •  0
  • Aquarius_Girl  · 技术社区  · 7 年前

    产量 (): https://en.cppreference.com/w/cpp/thread/yield
    通知一 (): http://www.cplusplus.com/reference/condition_variable/condition_variable/notify_one/

    案例:

    线程A应该完成它正在做的任何事情,然后唤醒线程B来完成它的工作。

    我在线程a'run()函数中编写了notify_one()调用。

    线程a发出通知1()的信号,但即使线程B准备好了,线程a仍然被重新调度,这种情况有可能吗?

    notify_one()和yield()是否等价?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Humphrey Winnebago    7 年前

    yield notify_one 是不相关的。

    产量 是(对操作系统)放弃其当前时间片的进程请求。下一次仍将安排线程。假设一个进程被分配了10毫秒 产量 5毫秒后,操作系统可以运行另一个进程。下一次轮到它跑的时候,它仍然能跑满10英里。操作系统不必满足请求。

    condition_variable::notify_one condition_variable::wait . 如果有任何线程正在等待,通知一个线程保证会唤醒其中一个线程。如果没有线程在等待,通知一将什么也不做。

    请注意,在调用wait时,条件变量必须与保护某些共享状态的1个互斥体一起使用(the 条件 ),它正在等待另一个线程在条件为真时发出信号。

    线程a发出通知1()的信号,但即使线程B准备好了,线程a仍然被重新调度,这种情况有可能吗?

    对。在Mesa语义中,给等待的线程发信号只会解除另一个线程的阻塞。当前线程可能会继续运行,直到时间用完为止。使用Hoare语义,信令线程将立即切换到等待线程。然而,几乎所有条件的实现都使用Mesa语义。

    notify_one()和yield()是否等价?

    “同等”意味着他们做同样的事情。事实并非如此。我想你是想问它们是免费的,还是同一个同步方案的一部分,答案是否定的,正如我上面解释的。

    如果我们使用 notify_one() 唤醒一根线,我们还需要 yield()

    如果线程A刚刚唤醒线程C nofity_one 如果您希望尽快运行线程C,可以调用 产量 放弃线程A的剩余时间片。但是,操作系统不需要批准您的请求。而且在线程C之前可能有许多线程被调度,您无法控制它们。

        2
  •  0
  •   Gyapti Jain    7 年前

    两者都有区别。有一种可能性,在你的情况下,你可以使用其中任何一个具有相同的效果。 yield 更通用 notify_one 提供对程序流的更多控制。

    产量 :放弃处理器以便操作系统可以计划 任何其他 线。
    通知一 :发出条件信号,以便 在这种情况下等待的线程之一 可以继续。

    线程A应该完成它正在做的任何事情,然后醒来 线程B来完成它的工作。

    通知一 是正确的选择,其中一个线程等待条件,而另一个线程可以发出信号。