【发布时间】: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