【发布时间】:2020-06-30 12:46:51
【问题描述】:
在 pthread 库中有取消点的概念。大多数可能会阻塞执行更长时间(或在某些资源上等待...)的系统函数可以被 pthread 取消点中止。
猜测有一些数据受条件变量保护,该条件变量在线程中执行,如下面的伪代码所示。该线程有一个设置清理过程,如果对该线程发出取消请求,则会调用该过程。
THREAD_CLEANUP_PROC {
UNLOCK(mutex) // Is this unlock required?
}
THREAD_PROC {
SET THREAD_CLEANUP = THREAD_CLEANUP_PROC
LOOP {
LOCK(mutex)
WHILE (condition == false) {
condition.WAIT(mutex) // wait interrupted, cancel point is called
}
// ... we have the lock
UNLOCK(mutex)
condition.NOTIFY_ALL()
read(descriptor); // wait for some data on a file descriptor while lock is not acquired
}
}
如果有人在等待条件变量时取消线程 (pthread_cancel()),有关 pthread_cond_wait 的文档说线程在获取锁时被解除阻塞,并在线程结束之前开始执行清理处理程序。
清理处理程序现在负责解锁该锁(互斥锁),这是真的吗?如果 - 就像在我的示例中一样 - 还有另一种阻塞方法,如 read,它在等待数据但没有获取锁的情况下阻塞?在这种情况下,read 也被解除阻塞,并且像以前一样调用清理处理程序。只有这一次清理处理程序不应解锁互斥锁。我对么。如果是这样,处理这种情况的最佳方法是什么?有没有应该遵循的共同概念?
【问题讨论】:
标签: c pthreads locking condition-variable code-cleanup