linux - Condvar 行为在信号之后,但在互斥体释放之前

标签 linux synchronization mutex

我试图了解在发出 condvar 信号后我有什么保证。

我相信基本的使用模式是这个(伪代码):

消费者线程:

Mutex.Enter()
  while(variable != ready)
     Condvar.Wait()
Mutex.Exit()

生产者线程:

Mutex.Enter()
  variable = ready
  Condvar.Broadcast()
  [Unknown?]
Mutext.Exit()

我的问题是。我对上面代码中的 [Unknown] 点有什么保证?我仍然持有互斥体,但我能知道消费者的什么状态?

从手册页中,我不清楚生产者在广播/发出信号之后和释放互斥量之前处于什么状态。

最佳答案

来自 condition vars :

pthread_cond_wait() 阻塞调用线程,直到发出指定条件的信号。这个例程应该在互斥锁被锁定时调用,它会在等待时自动释放互斥锁。接收到信号,线程被唤醒后,mutex会自动锁定,供线程使用。程序员然后负责在线程完成时解锁互斥锁。

因此,当生产者执行未知部分代码时,生产者持有互斥锁,而消费者被锁定在互斥锁上,直到生产者释放它。

关于linux - Condvar 行为在信号之后,但在互斥体释放之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557876/

相关文章:

Python 脚本在一段时间后停止

linux - 将单列文本文件编辑为多列

php - 什么 PHP 需要与 gettext 一起使用?

SVN 仓库同步

C++:Linux平台上的线程同步场景

c - pthread_mutex_lock 和 pthread_cond_wait/signal 导致死锁

c# - 保护应用程序和后台代理之间共享的等存储数据

linux - 查看同一用户在其他终端输入命令的历史记录

synchronization - 如何将这段代码转换为非阻塞和无锁?

c - 如何让多个线程互不干扰地读取多个文件?