我在做C ++多线程编程。我使用互斥锁来读取和写入队列以避免死锁。目前,我只为
启动了一个帖子 pthread_mutex_lock(&the_mutex);
但是,在GDB中,我的代码在这里被冻结,它正在等待。
为什么?只有一个线程!!!
感谢
答案 0 :(得分:6)
从pthread_mutex_lock()
手册页:
如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则应进行死锁检测 不提供。尝试重新锁定互斥锁会导致死锁。如果一个 线程尝试解锁未锁定的互斥锁或互斥锁 这是解锁的,未定义的行为结果。
如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归 锁定互斥锁导致未定义的行为。试图解锁 如果未被调用线程锁定,则互斥锁导致未定义 行为。如果未锁定互斥锁,则尝试解锁互斥锁 在未定义的行为中。
底线:如果您尝试锁定已锁定的互斥锁,则完全有可能仅使用一个线程导致死锁。
如果您想知道,在Linux上PTHREAD_MUTEX_DEFAULT
通常是PTHREAD_MUTEX_NORMAL
的同义词,而后者又是默认互斥初始化程序中使用的内容。