线程范例?

问题描述 投票:0回答:6

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

multithreading paradigms
6个回答
3
投票

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

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

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

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


0
投票

我不太明白这个问题,但如果你开始使用 CUDA 进行一些编码,会给你一些关于多线程应用程序的不同思考方式。

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

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

    给定一个集合 {a,b,c,d,e}
我想要以下套装:

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

本例中的符号“+”是任何交换运算符(不仅可以做加号,还可以进行乘法)。

如何并行执行此操作?这是对问题的彻底重新思考,在这篇

论文中进行了描述。

可以在 NVIDIA

网站中找到 CUDA 中不同算法的更多实现


0
投票
嗯,一个非常保守的范式转变是从以线程为中心的并发(共享一切)到以进程为中心的并发(地址空间分离)。这样就可以避免意外的数据共享,并且更容易在不同子系统之间实施通信策略。

这个想法很古老,并且由微内核操作系统社区传播(以及其他),以构建更可靠的操作系统。有趣的是,微软研究院的

Singularity操作系统原型表明,使用该模型时甚至不需要传统的地址空间。


0
投票
我最喜欢的相对较新的想法是

事务内存:通过确保更新始终是原子的来避免并发问题。


0
投票

0
投票

活动对象

class C { std::queue _q; void _foo(); public: void foo(){ _q.push_back(); } };
犹豫不决,双重检查

class C { bool _inited{}; void _init(); public: void init() { if( ! _inited ) _init(); _inited = true; }
防护悬架

std::condition_variable
领导者/追随者 - 像套接字

但更聪明

线程池 - 对于短命线程非常有用。

单写入锁 - 将共享数据视为原子更新的指向常量结构的指针的复杂方法。

监控

std::lock_guard
反应器、监听器、观察者

class Device { public: expect_X_event( std::function callback ); // Usually a capturing lambda. };
    
© www.soinside.com 2019 - 2024. All rights reserved.