我用互斥量和条件变量用C语言编写了一个用于教育目的的应用程序。
此处的简短示例:
while (!(is_done == 0))
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
您能解释一下,为什么在“ while”语句(以及从第二个线程接收到的信号)之后,当信号使互斥体被锁定时,我们需要解锁互斥体?
我从网络上的很多示例中得到了信息,但是当我想在接收信号后使用互斥锁时,是否需要解锁互斥锁? Ofc我想在接收信号后在此线程上工作
答案 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()
更改。一旦更改,并且您已完成访问互斥锁保护的共享状态,则必须解锁互斥锁。