我正在阅读并发性。对于具有令人困惑的相似定义的术语,我有点不知所措。即:
- 流程
- 线程
- 《绿线》
- 原型线程
- 纤维
- 协程
- Go 语言中的“Goroutines”
我的印象是,区别在于 (1) 是真正并行还是多路复用;(2) 是否在 CPU、操作系统或程序中进行管理;和(3..5)其他一些我无法识别的东西。
是否有关于这些并行方法之间差异的简洁明了的指南?
我正在阅读并发性。对于具有令人困惑的相似定义的术语,我有点不知所措。即:
我的印象是,区别在于 (1) 是真正并行还是多路复用;(2) 是否在 CPU、操作系统或程序中进行管理;和(3..5)其他一些我无法识别的东西。
是否有关于这些并行方法之间差异的简洁明了的指南?
好的,我会尽力而为。到处都有警告,但我会尽我最大的努力让我对这些术语和参考的理解与我给出的定义相近。
还值得注意的是,在过程演算意义上,术语“过程”的并发理论还有其他理解。这个定义与上面的定义是正交的,但我只是认为值得一提,这样如果你在某个地方看到在这个意义上使用的过程,就不会产生混淆。
另外,请注意parallel和concurrent之间的区别。您可能在问题中使用了前者,而我认为您的意思是后者。
我大多同意 Gian 的回答,但我对一些并发原语有不同的解释。请注意,这些术语经常被不同的作者不一致地使用。这些是我最喜欢的定义(希望离现代共识不远)。
我无法阻止自己播出的一个小烦恼:我不喜欢将“真正的并发”一词用于“处理器并行性”。这很常见,但我认为这会导致很多混乱。
对于大多数应用程序,我认为基于任务的框架最适合并行化。大多数流行的(英特尔的 TBB、苹果的 GCD、微软的 TPL 和 PPL)都使用线程作为工作线程。我希望有一些使用流程的好的替代方案,但我不知道有什么。
如果您对并发性(而不是处理器并行性)感兴趣,事件处理程序是最安全的方法。合作线程是一个有趣的选择,但有点狂野的西部。如果您关心软件的可靠性和健壮性,请不要将线程用于并发。
Protothreads 只是一个 switch case 实现,它就像一个状态机,但使软件的实现变得更加简单。它基于在 case 标签之前保存 a 和 int 值并返回,然后通过读回该变量并使用 switch 来确定从哪里继续来回到 case 之后的点的想法。所以protothread是状态机的顺序实现。
在实现顺序状态机时,Protothreads 非常棒。Protothreads 根本不是真正的线程,而是一种语法抽象,它使编写必须顺序切换状态(从一个到下一个等)的 switch/case 状态机变得更加容易。
我使用protothreads来实现异步io:http ://martinschroder.se/asynchronous-io-using-protothreads/