【问题标题】:Will calling pthread_cond_signal(...) then calling pthread_cond_wait(...) wake up the waiter?调用 pthread_cond_signal(...) 然后调用 pthread_cond_wait(...) 会唤醒服务员吗?
【发布时间】:2016-04-10 13:19:16
【问题描述】:

所以我在网上搜索了一些答案,但似乎没有任何明确的答案。我的问题很简单,比如说,我需要 5 个工作线程进入一个队列,然后向它们的老板线程(线程 6)发出信号,表明它们都在队列中准备好工作。由于我的程序其余部分的工作方式,如果我想要完成的工作确实有效,那将是最好的,也就是说:

所以如果我让老板线程锁定,看到队列没有完全满,老板会pthread_cond_wait(...); 并等到它满了。现在,所有工作线程都将进入队列并等待,一旦最后一个线程进入,他将向主线程发出信号然后等待。那么在最后一个工人发出信号到他等待他的时间之间,老板还会等到最后一个助手打到等待吗?因为我不希望老板在最后一个线程真正等待之前做任何事情。所以最后一个线程不会打到pthread_mutex_unlock(...),他会打到pthread_cond_wait(...),我想验证这是否会唤醒我们老板。在此先感谢,我希望我的问题很清楚,我倾向于过度解释一切:/

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

    老板可以等待工人发出的信号n次。每次唤醒时,它都会检查队列长度,如果未满则再次等待。 在这种情况下最好使用信号量。

    【讨论】:

      【解决方案2】:

      如果“boss 线程”在pthread_cond_wait() 中被阻塞,则在重新获取传递给该函数的互斥锁之前,它无法继续执行。

      因此,如果向老板线程发出信号的线程正在持有该互斥锁,那么老板线程将不会继续,直到信号线程释放互斥锁 - 这可以通过 pthread_mutex_unlock()pthread_cond_wait()(释放等待中的互斥锁)。

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 2022-01-13
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多