2017-07-01 522 views
-1

最受欢迎的筛选面试问题是:达到死锁所需的最少线程数量是多少?是否有可能在单个线程上发生死锁?

正确答案是2

但它是理论上可以使使用一个单独的线程死锁?

+0

没有什么会阻止单线程创建互斥体然后阻塞它,但这可能不被认为是死锁。 – seand

+0

可能并且在例如之前发生。在.NET中使用异步/等待和任务,在具有同步上下文的线程上。 – Noseratio

+0

如果您使用GOTO语言,那么我的猜测可能是肯定的:在wait()之前跳回到标签并完成。但它是依赖于语言的,而不是在所有上下文中都是有效的,所以... – lorenzog

回答

0

通过的deadlock定义:https://en.wikipedia.org/wiki/Deadlock

死锁是一种状态,其中一组操作中的每个成员,是 等待一些其他部件释放锁。

只有一个线程就无法达到死锁状态。

对于单线程,您可能会遇到infinite loophttps://en.wikipedia.org/wiki/Infinite_loop

如果我们考虑到协程,单线程应用程序确实可能会遇到死锁情况。这是由@David Schwartz提到的。

+0

如果这组操作的成员不是线程,而是由单个线程执行的函数呢?例如,考虑两个协程在单个线程中运行,其中每个协程都拥有另一个需要进行进度的锁。为什么这不是僵局?为什么这需要多个线程? –

+0

@DavidSchwartz,对。我同意。如果我们认为协程是单线程的。好的。它可以达到死锁。 –

1

这取决于你如何定义“线程”。例如,考虑使用协程来处理请求的单线程服务器。一个请求的协程可能会持有另一个线程需要的协程,反之亦然。协程在两者之间都不能取得进展。

你认为那些协同执行上下文线程吗?或不?

1

这里有一个单线程程序死锁,由于这样的事实,并行线程互斥量(默认)non-recursive

#include <stdio.h> 
#include <pthread.h> 

int main(int, char **) 
{ 
    pthread_mutex_t m; 
    pthread_mutex_init(&m, NULL); 

    printf("Locking non-recursive mutex once...\n"); 
    pthread_mutex_lock(&m); 

    printf("Locking non-recursive mutex again...\n"); 
    pthread_mutex_lock(&m); // deadlock occurs here, as we wait forever for the locked mutex to be unlocked... 

    printf("You won't ever see this text printed, because we'll be deadlocked above\n"); 

    return 0; 
} 

(如果设置互斥是递归互斥体,OTOH,这种情况下将会被互斥体处理,并且会避免死锁)