从cond变量接收到信号后,我们是否需要解锁互斥锁?

时间:2018-06-20 10:03:54

标签: c linux conditional mutex

我用互斥量和条件变量用C语言编写了一个用于教育目的的应用程序。

此处的简短示例:

while (!(is_done == 0))         
    pthread_cond_wait(&cond, &mutex);

 pthread_mutex_unlock(&mutex); 

您能解释一下,为什么在“ while”语句(以及从第二个线程接收到的信号)之后,当信号使互斥体被锁定时,我们需要解锁互斥体?

我从网络上的很多示例中得到了信息,但是当我想在接收信号后使用互斥锁时,是否需要解锁互斥锁? Ofc我想在接收信号后在此线程上工作

1 个答案:

答案 0 :(得分:0)

  

您能解释一下,为什么在“ while”语句(以及从第二个线程接收到的信号)之后,当信号使互斥体被锁定时,我们需要解锁互斥体?

pthread_cond_wait返回时,互斥锁被锁定,以便您可以安全地检查受其保护的共享状态:

  

这些函数自动释放互斥锁,并导致调用线程在条件变量cond上阻塞;原子地在这里是指“在原子上是关于另一个线程对互斥对象然后对条件变量的访问”。就是说,如果另一个线程能够在大约要释放的线程释放互斥量之后,则该线程中随后对render () { const items = _.map(data, (item, index) => { let id = item.ID; return ( ... <IconButton onClick={() => this.props.delete(id)} > ... ) }) } pthread_cond_broadcast()的调用应像已发出一样在大约要阻塞的线程被阻塞之后。

     

成功返回后,该互斥锁应已被锁定,并应归调用线程所有。如果互斥锁是健壮的互斥锁,其中所有者在持有锁的同时终止并且状态是可恢复的,则即使该函数返回错误代码,也必须获取互斥体。

通常,互斥锁应尽快解锁以减少争用。

在您的情况下,您等待共享状态pthread_cond_signal()更改。一旦更改,并且您已完成访问互斥锁保护的共享状态,则必须解锁互斥锁。