【问题标题】:Kill thread during it's waiting for pthread_mutex_lock在线程等待 pthread_mutex_lock 期间杀死线程
【发布时间】:2020-08-02 17:20:59
【问题描述】:

我在 Ubuntu 上用 C 语言编写代码。 我有超过 2 个这样的线程:

void * thread(void)
{

    retry:
      pthread_mutex_lock(&mutex);
        //DO SOMETHING
      pthread_mutex_unlock(&mutex);
    goto retry;

}

所以我有线程 1、线程 2、...、线程 N。 有时 thread2,...,threadN 可以使用 pthread_cancel() 从 thread1 中终止。

这个 pthread_cancel() 被插入到互斥体中,所以它在安全区域中被调用。

每次thread1在threadK上调用pthread_cancel()时,threadK都在等待一个mutex,所以它调用了函数pthread_mutex_lock()。

这东西会在我的程序中造成问题吗? 我的程序有一个错误,我认为我有一个死锁,但我不明白为什么。我想这就是原因。

在此先感谢大家。

【问题讨论】:

  • 您是否在线程实际上已锁定任何互斥锁时杀死线程?如果是这样,当持有锁的线程被杀死时,任何锁定的互斥体都将保持锁定状态。杀死线程通常是一个非常糟糕的设计 - 有太多可能出错的地方。
  • 好的,现在我明白我为什么会出现死锁了。谢谢
  • 杀死和取消不是一回事。 实际上在做什么
  • pthread_cancel()

标签: c multithreading pthreads mutex deadlock


【解决方案1】:

如果可以避免,请不要使用线程取消。有很多问题和陷阱需要解决。

一类问题与资源清理有关。尽管 POSIX 定义了一种注册清理处理程序的机制来解决这个问题,但要确保所有资源——分配的内存、打开的文件、互斥体和信号量、一般共享状态——都被这些资源正确清理,需要大量的艰苦工作。方法。例如,一个线程很容易无法解锁它在取消时保持锁定的互斥锁,从而使随后尝试无条件锁定它的每个线程死锁。

另一类更微妙的问题与线程实际上可以在哪些点被取消有关。默认情况下,带有挂起取消信号的线程将在下一次到达取消点或已在取消点阻塞时终止。相当多的 POSIX 函数肯定是或可能是取消点,但不是全部。

特别是pthread_mutex_lock() is not a cancellation point。因此,如果您取消在pthread_mutex_lock 中阻塞的线程,它不会立即被取消。原则上,它可能会成功锁定互斥锁,然后继续执行,直到达到取消点,或者它可能在不锁定互斥锁的情况下返回(使用非零返回码来指示错误的性质)。两者都可能给你带来麻烦,但前者似乎特别准备让你陷入僵局。在实践中,pthread_mutex_lock() 被记录为返回EINTR,这让我期待前一种选择会被展示:取消请求不会导致在pthread_mutex_lock() 中阻塞的线程在没有获取的情况下终止互斥体并返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2021-07-25
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多