是否有任何范例可以给您带来不同的思维方式或对编写多线程应用程序有不同的看法?也许感觉上有很大不同,比如过程式编程和函数式编程。

有帮助吗?

解决方案

针对不同的问题,并发有许多不同的模型。维基百科页面为 并发性 列出了一些型号,还有一个页面 并发模式 它为不同类型的并发处理方法提供了一些良好的起点。

您采取的方法很大程度上取决于当前的问题。不同的模型解决并发应用程序中可能出现的各种不同问题,有些模型是建立在其他模型之上的。

在课堂上我被教导并发使用 相互排斥同步 共同解决并发问题。有些解决方案只需要一个,但同时使用这两个解决方案应该能够解决任何并发问题。

对于一个截然不同的概念,您可以考虑不变性和并发性。如果所有数据都是不可变的,那么甚至不需要传统的并发方法。 本文 探讨该主题。

其他提示

我不太明白这个问题,但是如果你开始使用以下代码进行一些编码 CUDA 为您提供一些思考多线程应用程序的不同方式。

它不同于一般的多线程技术,如信号量、监视器等。因为你同时有数千个线程。因此,CUDA 中的并行性问题更多地在于对数据进行分区并稍后混合数据块。

彻底重新思考常见串行问题的一个小例子是 扫描 算法。它很简单:

  • 给定一个 SET {a,b,c,d,e}

我想要以下一组:

{a、a+b、a+b+c、a+b+c+d、a+b+c+d+e}

在这种情况下,符号“+”是任何可交换运算符(不仅是加号,还可以进行乘法)。

如何并行执行此操作?这是对问题的彻底重新思考,描述如下 .

CUDA 中不同算法的更多实现可以在 NVIDIA 网站

那么,一个非常保守模式的转变是从螺纹为中心的并发(分享一切)朝向流程为中心的并发(地址空间分离)。这样一个可避免意外的数据共享和它更容易执行不同的子系统之间的通信的策略。

这想法是旧的,被传播(其中包括)通过微内核操作系统的社区建立更可靠的操作系统。有趣的是,奇异 OS原型由微软研究表明,传统的地址空间与此模型工作时甚至不要求。

在相对较新的想法,我最喜欢的是事务内存:通过确保避免并发问题更新总是原子。

有在的OpenMP 一个LOOKSEE一个有趣的变化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top