我计划增强我对并行和并发编程的了解。 有人可以帮我找一些在线学习资源吗?
谢谢,
答案 0 :(得分:6)
如果您使用的是基于POSIX的系统(Linux,FreeBSD,Mac OS X等),您需要查看pthreads(链接到教程)。 Pthreads已经存在了很长时间,并且是基于POSIX平台的并发编程的事实标准。
虽然有一个新人,称为Grand Central Dispatch(链接到教程)。该技术由Apple(Snow Leopard)开发,旨在解决与pthread和多线程编程相关的一些繁琐问题。具体地:
块(匿名函数)被引入到C语言中(扩展名为C ++和Objective-C)。这允许您完全避免使用上下文结构。在一个例子中(大量使用伪代码),您可以使用pthreads编写类似的东西:
typedef struct { int val1; int val2; } context;
int main(){
int firstval = 5;
int secondval = 2;
context *c = malloc(sizeof(context));
c->val1 = firstval;
c->val2 = secondval;
create_new_thread(context, myFunct);
}
void myFunct(context *c){
printf("Contrived example %d %d", c->val1, c->val2);
}
这涉及很多工作 - 我们必须创建上下文,设置值,并确保我们的函数处理正确接收上下文。 GCD不是这样。我们可以改为编写以下代码:
int main(){
int firstval = 5;
int secondval = 2;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
printf("Contrived example %d %d", firstval, secondval);
});
}
注意那是多么简单!没有背景,甚至没有单独的功能。
GCD让内核管理线程计数。系统上的每个线程都会占用一些内核资源。在便携式设备上,多余的线程会降低电池寿命。在任何计算机上,多余的线程都会降低性能。 “多余”是什么意思?在2核机器上产生100个线程。使用pthread时,您必须明确管理线程数,确保您没有超载系统。当然,这很难做到。使用GCD,您只需告诉内核“当您有机会时执行此工作块” - 内核决定何时有足够的可用资源来运行代码 - 您不必担心这一点。
除了提供强大的基本多线程支持外,GCD还允许您的程序通过块与“源”进行交互。因此,您可以将文件描述符排入队列并告诉GCD“在需要读取新数据时运行此代码块”。所以内核会让你的程序闲置,直到有足够数量的数据进入,然后自动将你的块排队!
我只是触及了GCD可以做的事情。这是一项真正令人惊叹的技术,我强烈建议您查看docs。它目前在Mac OS X和FreeBSD上可用,并且它是开源的 - 所以如果你想让它在Linux上运行,你可以移植它:)。
如果您正在寻找数据并行应用程序的原始功能,Apple开发了另一项名为OpenCL的优秀技术(也适用于Snow Leopard),它可以让您在非常简单的C中利用GPU的强大功能 - 像(几乎完全是C,有一些警告)语言。我没有太多的经验,但从我听到的一切,它都很容易使用,非常强大。 OpenCL是open standard,在Mac OS X和Windows上实现。
所以,总结一下:pthreads适用于所有基于POSIX的系统(它很丑陋,但它是事实上的标准),GCD适用于Mac OS X和FreeBSD,OpenCL适用于需要所有数据并行应用程序的数据并行应用程序你能得到的力量!
答案 1 :(得分:1)
看看'实践中的并发'。标准书。
答案 2 :(得分:1)
Herb Sutter写了很多关于这个主题的好文章。 His site可能是一个很好的起点。