回答
通過的deadlock
定義:https://en.wikipedia.org/wiki/Deadlock:
死鎖是一種狀態,其中一組操作中的每個成員,是 等待一些其他部件釋放鎖。
只有一個線程就無法達到死鎖狀態。
對於單線程,您可能會遇到infinite loop
:https://en.wikipedia.org/wiki/Infinite_loop。
如果我們考慮到協程,單線程應用程序確實可能會遇到死鎖情況。這是由@David Schwartz提到的。
如果這組操作的成員不是線程,而是由單個線程執行的函數呢?例如,考慮兩個協程在單個線程中運行,其中每個協程都擁有另一個需要進行進度的鎖。爲什麼這不是僵局?爲什麼這需要多個線程? –
@DavidSchwartz,對。我同意。如果我們認爲協程是單線程的。好的。它可以達到死鎖。 –
這取決於你如何定義「線程」。例如,考慮使用協程來處理請求的單線程服務器。一個請求的協程可能會持有另一個線程需要的協程,反之亦然。協程在兩者之間都不能取得進展。
你認爲那些協同執行上下文線程嗎?或不?
這裏有一個單線程程序死鎖,由於這樣的事實,並行線程互斥量(默認)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,這種情況下將會被互斥體處理,並且會避免死鎖)
- 1. 調用FreeLibrary可能發生死鎖
- 2. 在這種簡單的情況下可能發生死鎖嗎?
- 3. 是「線程飢餓死鎖」在這裏發生的
- 4. 在揮杆員中是否有可能殺死線程?
- 5. 從工作線程調用UI線程時發生死鎖
- 6. 是否有可能在Clojure中複製事務死鎖?
- 7. Haskell MongoDB驅動程序可能發生死鎖
- 8. 是否有可能從C程序鎖定CPU上的所有線程?
- 9. 是否可以模擬Silverlight UI線程(重現死鎖場景)?
- 10. 是否有可能我的線程沒有被殺死當服務器死亡
- 11. 是否有可能殺死Weblogic中的卡住線程?
- 12. 如何判斷這個系統是否會發生死鎖?
- 13. Ruby線程死鎖
- 14. C#線程死鎖
- 15. C++線程死鎖
- 16. Python線程死鎖
- 17. Delphi線程死鎖
- 18. Java,線程死鎖?
- 19. 多線程死鎖
- 20. Java線程死鎖
- 21. neo4j在多線程更新關係時發生死鎖問題
- 22. 死鎖在Python線程
- 23. TAO在鎖定時發生死鎖
- 24. 是否有可能在等待Java中特定鎖的線程上調用notifyAll()?
- 25. 硬件發生「死鎖」還是軟件導致死鎖?
- 26. RwLock何時會發生死鎖而不是死鎖?
- 27. 線程是否在鎖FIFO上等待?
- 28. 在這段代碼中是否發生死鎖?
- 29. 在單個線程中導致死鎖的單休眠會話
- 30. 是否有可能從Python內部殺死Windows上的進程?
沒有什麼會阻止單線程創建互斥體然後阻塞它,但這可能不被認爲是死鎖。 – seand
可能並且在例如之前發生。在.NET中使用異步/等待和任務,在具有同步上下文的線程上。 – Noseratio
如果您使用GOTO語言,那麼我的猜測可能是肯定的:在wait()之前跳回到標籤並完成。但它是依賴於語言的,而不是在所有上下文中都是有效的,所以... – lorenzog