是否有任何范例可以给您带来不同的思维方式或对编写多线程应用程序有不同的看法?也许感觉上有很大不同,比如过程式编程和函数式编程。
我不太明白这个问题,但如果你开始使用 CUDA 进行一些编码,会给你一些关于多线程应用程序的不同思考方式。
它不同于一般的多线程技术,如信号量、监视器等,因为你同时有数千个线程。因此,CUDA 中的并行性问题更多地在于对数据进行分区并稍后混合数据块。
SCAN 算法只是彻底重新思考常见串行问题的一个小例子。很简单:
{a、a+b、a+b+c、a+b+c+d、a+b+c+d+e}
本例中的符号“+”是任何交换运算符(不仅可以做加号,还可以进行乘法)。
如何并行执行此操作?这是对问题的彻底重新思考,在这篇
论文中进行了描述。
可以在 NVIDIA这个想法很古老,并且由微内核操作系统社区传播(以及其他),以构建更可靠的操作系统。有趣的是,微软研究院的
Singularity操作系统原型表明,使用该模型时甚至不需要传统的地址空间。
OpenMP,了解有趣的变化。
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.
};