我在使用 pthreads 时遇到问题,我认为我遇到了死锁。我创建了一个我认为可以正常工作的阻塞队列,但是在进行了更多测试后,我发现如果我尝试取消阻塞在 blocking_queue 上的多个线程,我似乎遇到了死锁。
阻塞队列非常简单,看起来像这样:
template <class T> class Blocking_Queue
{
public:
Blocking_Queue()
{
pthread_mutex_init(&_lock, NULL);
pthread_cond_init(&_cond, NULL);
}
~Blocking_Queue()
{
pthread_mutex_destroy(&_lock);
pthread_cond_destroy(&_cond);
}
void put(T t)
{
pthread_mutex_lock(&_lock);
_queue.push(t);
pthread_cond_signal(&_cond);
pthread_mutex_unlock(&_lock);
}
T pull()
{
pthread_mutex_lock(&_lock);
while(_queue.empty())
{
pthread_cond_wait(&_cond, &_lock);
}
T t = _queue.front();
_queue.pop();
pthread_mutex_unlock(&_lock);
return t;
}
priavte:
std::queue<T> _queue;
pthread_cond_t _cond;
pthread_mutex_t _lock;
}
为了测试,我创建了 4 个线程来拉这个阻塞队列。我在阻塞队列中添加了一些打印语句,每个线程都进入 pthread_cond_wait() 方法。但是,当我尝试在每个线程上调用 pthread_cancel() 和 pthread_join() 时,程序就会挂起。
我也只用一个线程对此进行了测试,并且效果很好。
根据文档, pthread_cond_wait() 是一个取消点,因此在这些线程上调用取消应该会导致它们停止执行(这仅适用于 1 个线程)。但是 pthread_mutex_lock 不是取消点。在调用 pthread_cancel() 时是否会发生某些事情,被取消的线程在终止之前获取互斥锁并且不解锁它,然后当下一个线程被取消时它无法获取互斥锁和死锁?还是我做错了什么。
任何建议都会很可爱。谢谢 :)