2017-07-01 83 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,這種情況下將會被互斥體處理,並且會避免死鎖)