【问题标题】:segfault in critical section - avoiding deadlock关键部分的段错误 - 避免死锁
【发布时间】:2015-05-01 16:27:46
【问题描述】:

我在面试中被问到以下问题:

1) 有两个线程:T1 和 T2。他们共享一个资源并使用 pthread_mutex 进行同步以避免死锁。你将如何设计你的代码,使得如果在 T1 进入临界区之后发生任何分段错误,T2 就不会陷入死锁?

//T1 Code
try 
{
    pthread_mutex_lock(somelock);
    .... 
    /// work on shared memory
    //What will happen if segfault happens here?
    .... 
    pthread_mutex_unlock(somelock);
} catch(...)
{
   pthread_mutex_unlock(somelock);
   // exception happens
}

我说我不知道​​答案。面试官遇到这种情况等待我的回答。

在这种情况下真的有什么设计可以避免死锁吗?

上面的代码块只是为了理解。我读了this。但不清楚 提前致谢。

【问题讨论】:

  • try/catch 块无法防止分段错误。
  • 这就是为什么你应该使用std::lock_guard。当lock_guard 超出范围时,锁会自动释放。
  • 简单 - 确保受保护的部分非常小,非常简单,经过测试,不会发生段错误。
  • 堆栈展开是关于在堆栈上分配对象,以便无论控制退出方法,对象都会自动清理。这与线程因接收到信号而死亡无关,因为在这种情况下,该方法永远不会退出。
  • 也许不是。如果您安装了一个信号处理程序以便段错误不会杀死线程,那么也许您可以使用 RAII / 堆栈展开来清理。

标签: c++ c multithreading deadlock


【解决方案1】:

您可以使用信号处理程序捕获信号并随意处理资源。

我可以相信面试官的暗示是使用 RAII 习语 - 资源分配是初始化。

但我不确定这是否适用于信号...

【讨论】:

  • 如果进程/线程因接收到信号而终止,则堆栈不会展开,退出处理程序不会被调用,等等。线程只是终止。使用 RAII 来解决这种情况需要涉及 (1) 捕获信号,以及 (2) 避免 突然 终止。线程终止可能仍然是最干净的行为,但可能会通过引发异常来诱导受影响的函数更干净地终止。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2012-10-30
  • 1970-01-01
  • 2012-03-24
  • 2013-06-07
相关资源
最近更新 更多