【问题标题】:only one thread may cause deadlock or freezing the program on Linux?在Linux上只有一个线程可能导致死锁或冻结程序?
【发布时间】:2011-12-22 21:34:03
【问题描述】:

我正在做 C++ 多线程编程。我使用互斥锁来读取和写入队列以避免死锁。目前,我只为

启动 1 个线程
    pthread_mutex_lock(&the_mutex);

但是,在 GDB 中,我的代码在这里被冻结,它处于待处理状态。

为什么?只有一个线程!!!

谢谢

【问题讨论】:

  • 如何初始化互斥锁?
  • 我在类控制中使用 pthread_mutex_init(&mutex, NULL)。
  • 由于您似乎假设“锁定它的线程已经可以再次锁定它”,您可能正在寻找递归互斥锁 (PTHREAD_MUTEX_RECURSIVE)。关于这一点,请参阅:stackoverflow.com/questions/187761/… - 通常,可以实现这种行为。但递归锁定也往往会导致细微的错误。

标签: c++ linux multithreading mutex deadlock


【解决方案1】:

来自pthread_mutex_lock() 手册页:

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

如果互斥锁类型是 PTHREAD_MUTEX_DEFAULT,尝试递归 锁定互斥锁会导致未定义的行为。试图解锁 如果调用线程未锁定互斥锁,则会导致未定义 行为。如果未锁定结果,则尝试解锁互斥锁 在未定义的行为中。

底线:如果您尝试锁定已锁定的互斥锁,则完全有可能导致只有一个线程的死锁。

如果您想知道,在 Linux 上,PTHREAD_MUTEX_DEFAULT 通常是 PTHREAD_MUTEX_NORMAL 的同义词,而这又是默认互斥初始化器中使用的。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多