我计划增强我对并行和并发编程的了解.有人可以帮我找一些在线学习资源吗?
谢谢,
如果您使用的是基于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可以做的事情.这是一项真正令人惊叹的技术,我强烈建议您查看文档.它目前在Mac OS X和FreeBSD上可用,它是开源的 - 所以如果你想让它在Linux上运行,你可以移植它:).
如果你正在为数据并行应用程序寻找原始功能,那么Apple开发了另一项名为OpenCL的优秀技术(也适用于Snow Leopard),它可以让你以非常简单的C形式利用GPU的强大功能(它几乎就是C语言)有一些警告)语言.我没有太多的经验,但从我听到的一切,它都很容易使用,非常强大.OpenCL是一个开放标准,在Mac OS X和Windows上实现.
总而言之:pthreads适用于所有基于POSIX的系统(它很难看,但它是事实上的标准),Mac OS X和FreeBSD的GCD,以及数据并行应用程序的OpenCL,你需要所有的功能得到!