我目前正在编写一个大型多线程C++程序(> 50K LOC).
因此,我一直有动力阅读各种处理多线程代码的技术.我发现一个很酷的理论是:
http://en.wikipedia.org/wiki/Communicating_sequential_processes
它是由一个有点着名的人发明的,他为并发编程做出了其他重要的贡献.
但是,CSP是否在实践中使用?任何人都可以指向以CSP风格编写的任何大型应用程序吗?
谢谢!
CSP作为一个过程演算,从根本上说是一个理论上的东西,使我们能够正式化和研究并行程序的某些方面.
如果您想要一个能够构建分布式程序的理论,那么您应该考虑并行结构化编程.
并行结构编程是当前HPC(高性能计算)研究的基础,并为您提供有关如何处理和设计并行程序(实质上是通信计算节点的流程图)和运行时系统以实现它们的方法.
并行结构化编程的核心思想是最初由Murray Cole开发的算法骨架.骨架就像并行设计模式,与成本模型相关联,并且(通常)是支持它的运行时系统.骨架模型,研究并支持一类具有一定"形状"的并行算法.
作为一个值得注意的例子,mapreduce(由谷歌流行)只是一种解决数据并行性的骨架,其中计算可以通过映射阶段来描述(将函数f应用于组成输入数据的所有元素),以及减少阶段(获取所有已转换的项目并使用关联运算符"组合"它们).
我发现并行结构化编程的理念既有理论上的声音又有实用性,所以我建议你看看它.
关于多线程的一句话:由于骨架解决了大规模并行问题,通常它们是在分布式存储器中实现的,而不是共享的.英特尔开发了一种工具TBB,它可以解决多线程问题,并且(部分地)遵循并行结构化编程框架.它是一个C++库,所以你可能只是开始在你的项目中使用它.
是的,不是.CSP 的基本思想使用了很多.例如,一种或另一种形式的线程安全队列经常被用作主要(通常是唯一的)通信机制,以从各个进程(线程)构建管道.
然而,Hoare是Hoare,他的原始理论还不止于此.他发明了一个用于讨论过程的符号,定义了一组可以在过程之间发送的特定信号,等等.从那以后,符号已经以各种方式得到了改进,相当多的工作被用于证明各个方面,等等.
应用相对正式的CSP模型(而不仅仅是一般的想法)并不常见.它被用在一些系统中,其中高可靠性被认为是非常重要的,但很少有程序员似乎对学习(又一种)正式设计符号感兴趣.
当我设计这样的系统时,我通常使用的方法不那么严格,但(至少对我而言)更容易理解:一个相当简单的图表,框表示过程,箭头表示通信线.我怀疑我是否真的可以提供大量设计的证据(我承认我没有用这种方式设计一个非常庞大的系统),但它仍然运作得相当好.