回答
通过的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. 从工作线程调用UI线程时发生死锁
- 4. 是否有可能在Clojure中复制事务死锁?
- 5. 是否有可能从C程序锁定CPU上的所有线程?
- 6. 是否有可能我的线程没有被杀死当服务器死亡
- 7. 是否有可能杀死Weblogic中的卡住线程?
- 8. 如何判断这个系统是否会发生死锁?
- 9. Delphi线程死锁
- 10. Java线程死锁
- 11. Ruby线程死锁
- 12. Java,线程死锁?
- 13. C#线程死锁
- 14. neo4j在多线程更新关系时发生死锁问题
- 15. 死锁在Python线程
- 16. TAO在锁定时发生死锁
- 17. 硬件发生“死锁”还是软件导致死锁?
- 18. RwLock何时会发生死锁而不是死锁?
- 19. 线程是否在锁FIFO上等待?
- 20. 是否有可能从Python内部杀死Windows上的进程?
- 21. 两个线程程序防止死锁
- 22. RMI如何发生死锁?
- 23. 死锁上奇怪的线程转储
- 24. 在更新单个表格上的两个不同行时发生死锁
- 25. ppmap/parallel python中是否存在隐藏的可能死锁?
- 26. 是否有可能在javascript变量上发生更改事件?
- 27. 死锁的线程java
- 28. 多线程中的死锁
- 29. 线程池死锁与Task.Result
- 30. 线程死锁异步
没有什么会阻止单线程创建互斥体然后阻塞它,但这可能不被认为是死锁。 – seand
可能并且在例如之前发生。在.NET中使用异步/等待和任务,在具有同步上下文的线程上。 – Noseratio
如果您使用GOTO语言,那么我的猜测可能是肯定的:在wait()之前跳回到标签并完成。但它是依赖于语言的,而不是在所有上下文中都是有效的,所以... – lorenzog