是否在大型多线程C ++程序中使用了通信顺序进程?

时间:2010-02-07 04:40:01

标签: c++ multithreading

我目前正在编写一个大型多线程C ++程序(> 50K LOC)。

因此,我一直有动力阅读各种处理多线程代码的技术。我发现一个很酷的理论是:

http://en.wikipedia.org/wiki/Communicating_sequential_processes

它是由一个有点名气的人发明的,他为并发编程做出了其他重要的贡献。

但是,CSP是否在实践中使用?任何人都可以指向以CSP风格编写的任何大型应用程序吗?

谢谢!

9 个答案:

答案 0 :(得分:9)

作为一个过程演算,CSP从根本上说是一个理论上的东西,它使我们能够正式化和研究并行程序的某些方面。

如果您想要一个能够构建分布式程序的理论,那么您应该看看 parallel structured programming

并行结构编程是当前HPC(高性能计算)研究的基础,并为您提供有关如何处理和设计并行程序(实质上是通信计算节点的流程图)和运行时系统<的方法。 / em>实现它们。

并行结构化编程的核心思想是最初由Murray Cole开发的算法骨架。骨架就像并行设计模式,与成本模型相关联,并且(通常)是支持它的运行时系统。骨架模型研究支持一类具有特定“形状”的并行算法。

作为一个值得注意的例子, mapreduce (受谷歌欢迎)只是一种解决数据并行性的骨架,其中计算可以通过 map 阶段来描述(将函数f应用于组成输入数据的所有元素)和 reduce 阶段(获取所有已转换的项目并使用关联运算符“组合”它们)。

我发现并行结构化编程的理论既有理论上的声音又有实用性,所以我建议你先看看它。

关于多线程的一句话:由于骨架解决了大规模并行问题,通常它们是在分布式内存中实现的,而不是共享的。英特尔开发了一个工具TBB,它解决了多线程问题,并且(部分地)遵循并行结构化编程框架。它是一个C ++库,所以你可能只是开始在你的项目中使用它。

答案 1 :(得分:6)

是和否。 CSP的基本想法使用得相当多。例如,一种或另一种形式的线程安全队列经常被用作主要(通常是唯一的)通信机制,以从各个进程(线程)构建管道。

然而,Hoare是Hoare,他的原始理论还不止于此。他发明了一个用于讨论过程的符号,定义了一组可以在过程之间发送的特定信号,等等。从那以后,这种符号已经以各种方式得到了改进,相当多的工作都用于证明各个方面,等等。

应用相对正式的CSP模型(而不仅仅是一般的想法)并不常见。它被用在一些系统中,其中高可靠性被认为是非常重要的,但很少有程序员似乎对学习(又一种)正式设计符号感兴趣。

当我设计这样的系统时,我通常使用的方法不那么严格,但(至少对我来说)更容易理解:一个相当简单的图表,框表示过程,箭头表示沟通渠道。我怀疑我能否真正提供大多数设计的证明(我承认我没有用这种方式设计一个真正的巨大的系统),但它仍然运行得相当好

答案 2 :(得分:3)

查看名为Verum的公司的网站。他们的ASD技术基于CSP,并被飞利浦医疗保健,爱立信和恩智浦半导体等公司用于为各种高科技设备和应用构建软件。

所以回答你的问题:是的,CSP用于现实生活中的大型软件项目。

完全披露:我为Verum做自由职业

答案 3 :(得分:2)

回答一个非常古老的问题,但似乎很重要的一个

Go有CSP是该语言的基本组成部分。在FAQ to Go中,作者写道:

  

并发和多线程编程有很高的声誉。我们认为这部分是由于pthreads之类的复杂设计,部分原因是过分强调互斥,条件变量和内存障碍等低级细节。更高级别的接口可以实现更简单的代码,即使仍然存在互斥体等等。

     

为并发提供高级语言支持的最成功的模型之一来自Hoare的通信顺序进程或CSP。 Occam和Erlang是两种众所周知的语言,源于CSP。 Go的并发原语派生自家谱的不同部分,其主要贡献是作为第一类对象的强大通道概念。几种早期语言的经验表明,CSP模型非常适合程序语言框架。

Go中实施的项目是:

答案 4 :(得分:0)

这种风格在Unix上无处不在,其中许多工具被设计用于从标准输入到标准输出。我对那些以这种方式构建的大型系统没有任何第一手资料,但我已经看到许多小型的一次性系统

例如,这个简单的命令行使用(至少)3个进程。

cat list-1 list-2 list-3 | sort | uniq > final.list

答案 5 :(得分:0)

这个系统只是中等大小,但是我编写了一个协议处理器,它在一个使用与此非常类似的样式的消息中剥离并解释连续的协议层。它是一个使用类似于协作线程的事件驱动系统,但我可以通过一些额外的调整相当容易地使用多线程。

该程序是专有的(不幸的是)所以我无法展示源代码。

在我看来,这种风格对某些东西很有用,但通常最好与其他一些技巧混合使用。通常,程序的核心部分代表处理瓶颈,并且应用各种并发增加技术可能会产生最大的收益。

答案 6 :(得分:0)

微软有一项名为ActiveMovie的技术(如果我没记错的话),它对音频和视频流进行了顺序处理。数据从一个过滤器传递到另一个过滤器,从输入格式转换为输出格式(以及源/接收器)。也许这是一个实际的例子?

答案 7 :(得分:0)

维基百科文章向我看起来像很多有趣的符号,用于表示某些行人概念。对于非常大或可扩展的程序,形式主义对于检查(子)进程如何允许交互非常重要。

对于50,000线路课程,您可能最好在您认为合适的情况下构建它。

一般而言,在性能方面,遵循这些想法是一个好主意。分阶段处理数据的持久线程往往不会竞争,并且很好地利用数据局部性。此外,很容易限制线程以避免数据堆积,因为快速阶段会进入缓慢的阶段:如果输出缓冲区变得太大,则阻止快速阶段。

答案 8 :(得分:0)

有点偏离主题但是对于我的论文,我使用了一个名为TERRA/LUNA的工具框架,该框架旨在用于嵌入式控制系统的软件开发,但在我的研究所大量用于各种软件开发(所以只有大专院校)在这里使用)。 TERRA是一个图形化的CSP和软件架构编辑器,LUNA既是基于CSP的构造的C ++库的名称,也是TERRA中用于从CSP模型生成C ++代码的插件。 结合FDR3(CSP细化检查器)来检测任何类型的(死/生命/等)锁定甚至分析都变得非常方便。