pthreads에 문제가 있는데 어디서 교착 상태에 빠졌다고 생각합니다. 내가 생각했던 차단 대기열을 만들었지 만, 더 많은 테스트를 한 후에 blocking_queue에서 차단중인 여러 스레드를 취소하려고하면 교착 상태가 발생하는 것으로 나타났습니다.C++ pthread 블로킹 큐 데드락 (내 생각 엔)
블로킹 큐는 매우 간단하며 다음과 같습니다
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 개 스레드를 만들었습니다. 블로킹 큐에 print 문을 추가하고 각 스레드가 pthread_cond_wait() 메서드를 사용하고 있습니다. 그러나, 각 스레드에서 pthread_cancel() 및 pthread_join()을 호출하려고하면 프로그램이 중단됩니다.
나는 하나의 스레드로 이것을 테스트했으며 완벽하게 작동합니다.
설명서에 따르면 pthread_cond_wait()은 취소 지점이므로 해당 스레드에서 cancel을 호출하면 실행이 중지되어야합니다 (단 하나의 스레드에서만 작동 함). 그러나 pthread_mutex_lock은 취소 지점이 아닙니다. pthread_cancel()이 호출 될 때 어떤 일이 벌어지면, 취소 된 쓰레드는 종료하기 전에 뮤텍스를 받아서 풀지 않으며, 다음 쓰레드가 취소되면 뮤텍스와 데드락을 얻을 수 없습니까? 아니면 제가 잘못하고있는 다른 것이 있습니다.
어떤 조언도 좋을 것입니다. 고마워요 :)
봅니다 [helgrind] (http://valgrind.org/info/tools.html#helgrind), 나를 위해 과거에 유용있어 사용 경쟁 조건 및 교착 상태를 탐지하기위한 것입니다. – Flexo
취소는 위험 할 수 있습니다. 논리를 좀 더 보여주세요. 작업자 스레드의 취소 가능성 상태는 무엇입니까?클린업 처리기는 무엇입니까? 정확히 어떻게 여러 스레드에서 취소/결합하라는 명령을 어떻게 처리하고 있습니까? – pilcrow