在Linux上,只有一个线程可能导致死锁或冻结程序? 我正在做C++多线程编程。我使用互斥来读写队列,以避免死锁。目前,我只启动了1个线程 pthread_mutex_lock(&the_mutex);

在Linux上,只有一个线程可能导致死锁或冻结程序? 我正在做C++多线程编程。我使用互斥来读写队列,以避免死锁。目前,我只启动了1个线程 pthread_mutex_lock(&the_mutex);,c++,linux,multithreading,mutex,deadlock,C++,Linux,Multithreading,Mutex,Deadlock,但是,在GDB中,我的代码在这里被冻结,它是挂起的 为什么??只有一根线 感谢手册页上的: 如果互斥类型为PTHREAD_mutex_NORMAL,则应执行死锁检测 不提供。尝试重新锁定互斥锁会导致死锁。如果 线程尝试解锁未锁定的互斥锁或互斥锁 这是未锁定的、未定义的行为结果 如果互斥类型为PTHREAD_mutex_DEFAULT,则尝试递归 锁定互斥锁会导致未定义的行为。正在尝试解锁 如果互斥对象未被调用线程锁定,则会导致未定义互斥对象 行为。如果未锁定互斥锁,尝试将其解锁将导致 在未定义的

但是,在GDB中,我的代码在这里被冻结,它是挂起的

为什么??只有一根线

感谢手册页上的:

如果互斥类型为PTHREAD_mutex_NORMAL,则应执行死锁检测 不提供。尝试重新锁定互斥锁会导致死锁。如果 线程尝试解锁未锁定的互斥锁或互斥锁 这是未锁定的、未定义的行为结果

如果互斥类型为PTHREAD_mutex_DEFAULT,则尝试递归 锁定互斥锁会导致未定义的行为。正在尝试解锁 如果互斥对象未被调用线程锁定,则会导致未定义互斥对象 行为。如果未锁定互斥锁,尝试将其解锁将导致 在未定义的行为中

一句话:如果您试图锁定一个已经锁定的互斥锁,则完全有可能导致只有一个线程的死锁


如果您想知道,在Linux上,
PTHREAD\u MUTEX\u DEFAULT
通常是
PTHREAD\u MUTEX\u NORMAL
的同义词,而这又是默认互斥体初始化器中使用的内容。

如何初始化互斥体?我在类控件中使用PTHREAD\u MUTEX\u init(&MUTEX,NULL)。因为您似乎假设“锁定它的线程已经可以再次锁定它”您可能正在寻找递归互斥体(
PTHREAD\u MUTEX\u recursive
)。关于这一点,请参阅:-一般来说,实现此行为是可能的。但是递归锁定也会允许出现细微的错误。