【问题标题】:Signalling a condition variable (pthreads)向条件变量发出信号(pthreads)
【发布时间】:2011-07-07 17:18:46
【问题描述】:

假设某个条件变量“cond”与互斥变量“mutex”相关联。如果一个线程在调用pthread_cond_wait(&cond,&mutex) 之后在cond 上休眠,并且另一个锁定mutex 的线程已完成,那么该线程在调用pthread_cond_signal(&cond) 之前还是之后调用pthread_mutex_unlock(&mutex) 是否重要?如果它调用pthread_cond_signal(&cond),它是否甚至需要解锁互斥锁,因为睡眠线程无论如何都会获取互斥锁?

编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview,“调用 pthread_cond_signal() 后未能解锁互斥锁可能不允许匹配的 pthread_cond_wait() 例程完成(它将保持阻塞状态)。”我想那时,解锁,也许只是之后,是必需的。

【问题讨论】:

  • +1 回答您自己的问题。

标签: c pthreads posix mutex condition-variable


【解决方案1】:

在调用pthread_cond_signal 后,您应该始终解锁互斥锁。以下是一些值得阅读的好问题/答案:

Calling pthread_cond_signal without locking mutex

它现在不会来找我,但我很确定有充分的理由(就竞争条件而言)您不想在发出信号之前解锁互斥锁。

【讨论】:

【解决方案2】:

如果保持互斥锁锁定,则被唤醒的线程无法获取互斥锁,因此将阻塞在pthread_cond_wait 等待重新获取互斥锁。

您无需锁定互斥锁即可调用pthread_cond_signal。事实上,如果您的应用程序逻辑可以在互斥锁未锁定时使用信号,那么这是一种更好的方法 --- 操作系统可以立即调度等待线程,而不必等待信号线程在继续之前解锁互斥锁。

但是,在这种情况下,必须注意确保唤醒不会丢失,并且您不会遇到“错误”线程被唤醒的问题。如果您使用直截了当的谓词,这在实践中应该不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2011-03-31
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多