有没有什么范例可以让你有不同的心态,或者对编写多线程应用程序有不同的看法?也许感觉上有很大的不同,比如过程编程和函数编程。
发布于 2009-02-27 20:18:12
对于不同的问题,并发有许多不同的模型。concurrency的维基百科页面列出了一些模型,还有一个concurrency patterns的页面,它为不同类型的并发方法提供了一些很好的起点。
你采取的方法很大程度上取决于手头的问题。不同的模型可以解决并发应用程序中可能出现的各种不同的问题,有些模型建立在其他模型的基础上。
在课堂上,我学到了concurrency结合使用mutual exclusion和synchronization来解决并发问题。有些解决方案只需要一个,但是使用这两个解决方案,您应该能够解决任何并发问题。
对于一个截然不同的概念,你可以看看不变性和并发性。如果所有数据都是不可变的,那么传统的并发方法甚至都不是必需的。This article探讨了这个话题。
发布于 2009-02-27 20:21:49
我真的不理解这个问题,但是如果你开始使用CUDA进行一些编码,我会给你一些关于多线程应用程序的不同的思考方式。
它不同于一般的多线程技术,如信号量、监视器等,因为您同时拥有数千个线程。因此,CUDA中的并行性问题更多地存在于对数据进行分区和稍后混合数据块。
对常见的串行问题进行彻底反思的一个小例子是SCAN算法。它就像这样简单:
给定集合{a,b,c,d,e}的
我想要以下一套:
{a,a+b,a+b+c,a+b+c+d,a+b+c+d+e}
在这种情况下,符号'+‘是任何交换运算符(不仅是加号,你还可以做乘法)。
如何并行实现这一点?这是对这个问题的一个彻底的重新思考,在这个paper中描述了它。
在NVIDIA website中可以找到CUDA中不同算法的更多实现
发布于 2009-02-27 20:47:05
好吧,一个非常保守的范式转变是从以线程为中心的并发(共享一切)到以进程为中心的并发(地址空间分离)。这样可以避免意外的数据共享,并且更容易在不同子系统之间实施通信策略。
这是一个古老的想法,由Micro-Kernel OS社区传播(在其他方面),以构建更可靠的操作系统。有趣的是,微软研究院的Singularity OS原型表明,在使用此模型时,甚至不需要传统的地址空间。
https://stackoverflow.com/questions/596449
复制相似问题