繁体   English   中英

线程范式?

[英]Threading paradigm?

是否有任何范例给您不同的心态或对编写多线程应用程序有不同的看法? 也许感觉上有很大的不同,例如从过程编程到函数编程。

并发具有许多用于解决不同问题的模型。 Wikipedia的并发页面列出了一些模型,并且还有一个页面,用于并发模式 ,这为使用各种并发方法提供了很好的起点。

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

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

对于截然不同的概念,您可以查看不变性和并发性。 如果所有数据都是不可变的,那么甚至不需要常规的并发方法。 本文探讨了该主题。

我不太了解这个问题,但是如果您开始使用CUDA进行一些编码,则会为您提供有关多线程应用程序的不同思考方式。

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

完全重新思考一个常见串行问题的一个小例子就是SCAN算法。 它很简单:

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

我需要以下设置:

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

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

如何并行执行此操作? 本文对此进行了全面的重新思考。

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

好吧,一个非常保守的范式转换是从以线程为中心的并发(共享所有内容)到以进程为中心的并发(地址空间分离)。 这样一来,可以避免意外的数据共享,并且可以更轻松地在不同子系统之间实施通信策略。

这个想法是古老的,并由Micro-Kernel OS社区传播(其中包括)以构建更可靠的操作系统。 有趣的是,Microsoft Research的Singularity OS原型表明,使用此模型时,甚至不需要传统的地址空间。

我最喜欢的一个相对较新的想法是事务性存储 :通过确保更新始终是原子性来避免并发问题。

看看OpenMP的有趣变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM