linux - 抢占式线程与非抢占式线程

标签 linux multithreading unix pthreads

有人可以解释一下抢占式线程模型和非抢占式线程模型之间的区别吗?

据我了解:

  • 非抢占式线程模型:一旦线程启动,它就无法停止,或者在线程完成其任务之前无法将控制权转移给其他线程。
  • 抢占式线程模型: 允许运行时随时介入并将控制权从一个线程转移到另一个线程。较高优先级的线程优先于较低优先级的线程。

有人可以请吗:

  1. 说明理解是否正确。
  2. 解释两种模型的优缺点。
  3. 一个何时使用真正有用的例子。
  4. 如果我在 Linux(system v 或 Pthread)中创建线程而不提及任何选项(是否有任何选项??)默认使用的线程模型是抢占式线程模型?

最佳答案

  1. 不,您的理解并不完全正确。非抢占式(又名协作)线程通常手动让出控制权,以让其他线程在完成之前运行(尽管由该线程调用 yield() (或其他)来实现这一点。
  2. 抢占线程更简单。协作线程的开销更少。
  3. 通常使用抢占式。如果您发现您的设计有很多线程切换开销,那么协作线程将是一种可能的优化。在许多(大多数?)情况下,这将是一笔相当大的投资,但返回却微乎其微。
  4. 是的,默认情况下您会获得抢占式线程,但如果您四处寻找 CThreads 包,它支持协作线程。很少有人(现在)想要合作线程,但我不确定它是否在过去十年内得到了更新......

关于linux - 抢占式线程与非抢占式线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147221/

相关文章:

multithreading - 有关Win32的多进程窗口所有权的MSDN文档在哪里? (Chrome使用此功能)

python - 如何在 paramiko 中写入标准输入(从 exec_command 返回)?

c - 如何查询服务器并获取 MX、A、NS 记录

Java调用bash脚本: Permission Denied Error

linux - 如何在 C++ 中正确链接 .so 库?

php - 本地主机上的 mysql_connect()

multithreading - Julia线程中的变量是循环线程本地的吗?

.net - .NET UI 元素线程限制的原因

unix - Redis RDB 持久性实际上是如何在幕后工作的?

linux - 从任何地方执行 shell 文件