是否有任何范例可以为您提供不同的思维方式或对编写多线程应用程序有不同的看法?也许是程序编程与函数编程完全不同的东西。
答案 0 :(得分:2)
并发为不同的问题提供了许多不同的模型。 concurrency的维基百科页面列出了一些模型,并且还有一个concurrency patterns的页面,它有一些很好的起点可以用于各种方法来实现并发。
您采取的方法非常依赖于手头的问题。不同的模型解决了并发应用程序中可能出现的各种不同问题,有些则基于其他问题。
在课堂上我被教导说并发使用mutual exclusion和synchronization来解决并发问题。有些解决方案只需要一个,但两者都应该能够解决任何并发问题。
对于一个截然不同的概念,你可以看一下不变性和并发性。如果所有数据都是不可变的,则甚至不需要传统的并发方法。 This article探讨了这个话题。
答案 1 :(得分:0)
我真的不明白这个问题,但如果你开始使用CUDA进行编码,可以给出一些不同的思考多线程应用程序的方法。
它不同于一般的多线程技术,如信号量,监视器等,因为你同时拥有数千个线程。因此,CUDA中的并行性问题更多地在于对数据进行分区并在以后混合数据块。
只是一个完整重新思考常见串行问题的小例子是SCAN算法。它很简单:
我想要以下内容:
{a,a + b,a + b + c,a + b + c + d,a + b + c + d + e}
在这种情况下,符号'+'是任何Commutattive运算符(不仅是加号,你也可以进行乘法运算)。
如何并行执行此操作?这是对问题的完全重新思考,在paper中进行了描述。
在NVIDIA中可以找到更多CUDA中不同算法的实现website
答案 2 :(得分:0)
嗯,一个非常保守的范式转变是从以线程为中心的并发(共享一切)到以流程为中心的并发(地址空间分离)。这样就可以避免意外的数据共享,并且更容易在不同的子系统之间实施通信策略。
这个想法很老,并且由Micro-Kernel OS社区传播(以及其他)以构建更可靠的操作系统。有趣的是,Microsoft Research的{{3}}操作系统原型显示,使用此模型时甚至不需要传统的地址空间。
答案 3 :(得分:0)
我最喜欢的一个相对较新的想法是transactional memory:通过确保更新始终是原子的来避免并发问题。
答案 4 :(得分:0)
请查看OpenMP有趣的变体。