为什么在调用pthread_cond_wait之前需要锁定互斥锁?

另外,在调用pthread_cond_signal之前是否需要锁定(在同一互斥锁上)?

谢谢你的帮助。

最佳答案

为什么在调用pthread_cond_wait之前需要锁定互斥锁?


因为否则,将不可避免地出现竞争状况。

互斥锁保护共享状态。条件变量与状态上的某些谓词(“条件”)相关联。基本思想是您要:

1)检查谓词

2)如果谓词为假,请入睡直至变为真

在并发系统中,某个线程始终有可能在(1)和(2)之间使谓词为真。为了避免这种竞争,必须在(1)之前持有一个互斥锁,并且在执行(2)时必须自动释放它。

例如,对于队列,谓词可能为“队列不为空”。但是在您检查队列是否为非空的时间与您进入睡眠的时间之间,某些其他线程可能会在队列中添加一些内容。

因此,在检查谓词时以及在调用pthread_cond_wait时,都必须持有互斥量。


另外,在调用pthread_cond_signal之前是否需要在同一互斥锁上进行锁定?


据我所知,这没有根本的问题。它只会带来潜在的低效率。

同样,无论您要修改(从而使谓词为真)的任何共享状态都必须由互斥量保护。因此,无论何时要发出状态信号,您都必须已经持有互斥量。

如果在发出条件信号之前释放互斥锁,则由于某些其他线程的作用,谓词有可能在其间变为假。这种竞争不会导致失败,因为任何等待条件的线程都必须在继续操作之前仔细检查该谓词。但是,为什么要解决这个麻烦呢?

底线:只需按照说明进行操作,您甚至不必考虑这些问题。 :-)

关于pthreads - pthread_cond_wait和互斥体要求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6312342/

10-14 12:51