只有一个线程可能会导致 Linux 上的程序死锁或冻结
only one thread may cause deadlock or freezing the program on Linux?
我正在做C++多线程编程。我使用互斥锁来读取和写入队列以避免死锁。目前,我只启动 1 个线程
pthread_mutex_lock(&the_mutex);
但是,在 GDB 中,我的代码被冻结在这里,它正在等待。
为什么? 只有一个线程!!
谢谢
从pthread_mutex_lock()
手册页:
如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则死锁检测应 不提供。尝试重新锁定互斥锁会导致死锁。如果 线程尝试解锁尚未锁定的互斥锁或互斥锁 这是解锁的,未定义的行为结果。
如果互斥锁类型PTHREAD_MUTEX_DEFAULT,则尝试递归 锁定互斥锁会导致未定义的行为。正在尝试解锁 如果互斥锁未被调用线程锁定,则会导致未定义 行为。尝试解锁互斥锁(如果未锁定(结果 在未定义的行为中。
底线:如果您尝试锁定已锁定的互斥锁,则完全有可能仅使用一个线程导致死锁。
如果您想知道,在 Linux 上,PTHREAD_MUTEX_DEFAULT
通常是 PTHREAD_MUTEX_NORMAL
的同义词,而 又是默认互斥体初始值设定项中使用的内容。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 如何重现 Boost 进程文档提示的死锁?
- 多线程Windows GUI应用程序中的死锁
- 为什么printf会导致与future.get的死锁,而cout则不会?
- C++中具有阻塞队列和障碍的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 程序在 C++11 中使用条件变量进入死锁
- 为什么我的程序在拥有线程的情况下生成LdrpLoaderLock死锁
- 如何在C++Qt程序中调试多线程死锁
- 如何在这个小的多线程程序中调试死锁
- 只有一个线程可能会导致 Linux 上的程序死锁或冻结
- 我应该选择什么样的同步方案来避免在实时,c++ /MFC应用程序上的死锁
- 多线程应用程序中的死锁检测
- 避免多线程应用程序中潜在的死锁/内存泄漏