【问题标题】:Is it correct to call pthread_cond_wait() and pthread_cond_timedwait() on the same condvar by different threads?不同线程在同一个 condvar 上调用 pthread_cond_wait() 和 pthread_cond_timedwait() 是否正确?
【发布时间】:2014-04-12 11:13:15
【问题描述】:

我试图了解 pthread_cond_broadcast() 的工作原理以及是否可以将线程“附加”到已被另一个线程阻塞的事件(广播信号)的等待列表(或队列)。

假设我们有两个线程。

线程 #1 处于等待循环中

pthread_mutex_lock();

while(condition_is_false) 

  pthread_cond_wait(); 

pthread_mutex_unlock(); 

在这个过程的中间某个地方,当线程 #1 已经阻塞时,另一个线程 #2 调用相同或几乎相同的代码,希望“附加”到同一个 condvar:

pthread_mutex_lock();

while(condition_is_false) 

  pthread_cond_wait(); or pthread_cond_timedwait()

pthread_mutex_unlock(); 

据我了解,线程 #2 在解锁之前无法访问由互斥锁锁定的代码。我说的对吗?

我正在尝试实施下一个案例:有些任务需要一段时间才能完成。在此期间,不允许另一个线程复制已经在进行中的相同任务,但要等到它完成。当任务最终完成时,所有线程必须得到相同的结果。

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

    您的场景正是为其设计条件变量的场景。

    第二个线程实现对互斥锁的锁定没有问题,因为等待(和派生)在等待期间暂时释放互斥锁,并在回来时重新获取它。

    您应该明确阅读有关互斥锁和条件变量概念的丰富文档。

    【讨论】:

    • 谢谢。最后一个问题是关于混合 pthread_cond_wait() 和 pthread_cond_timedwait() 调用。在同一个 condvar 上使用不同的函数是否正确?
    • @user3526517,当然,为什么不呢?
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2016-02-10
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多