我想开始使用线程并了解 C/C++ 中的线程。
有没有标准库?还有哪些是最常用的,或者您会向线程初学者推荐哪些?
在大多数平台上,您需要操作系统内核支持才能以高性能方式执行线程(例如,可以一次使用多个 CPU 内核)。(我会注意到在用户空间中可以进行协作线程,但现在这是不典型的。makecontext
例如参见 Linux)
内核调用:
在 Linux 和 Mac 上,pthreads api 是clone
系统调用的瘦包装器。
在 Windows、Windows APICreateThread
和朋友上。
标准库(包装内核调用):
在 C11 上,<threads.h>
在 C++11 上,std::thread
和朋友们。
第 3 方库(包含上述内容):
apr(阿帕奇运行时)
提升::线程
Qt
好多其它的
由于 C++11 有std::thread
在此之前,所有解决方案都是特定于平台的。
根据我自己的经验,我的两分钱:
1) 作为第一步,pthreads(C 的 POSIX)和我使用的链接是 Hunter McMillen computing.llnl.gov/tutorials/pthreads。它简明扼要,值得一读。
2)在那之后,在 C++ 中我去了 boost 接口(寻找)。我建议阅读 C++ Concurrency in Action ( http://www.manning.com/williams/ ) 一书。这样做的好处是本书
C++ 在其最新版本 (C++11) 中具有 std::thread。否则,Qt 经常用于很多东西,或者如果您不需要 Qt 中的所有其他东西或不喜欢许可问题,则使用 boost::thread。
C 没有标准线程。
我建议使用 OpenMP;这是非常容易使用。
http://en.wikipedia.org/wiki/OpenMP
http://openmp.org/wp/openmp-specifications/
示例:在线程之间分配数组中元素的计算:
float array[i];
#pragma omp parallel for // This is the important bit
for (int i = 0; i < N; ++i)
{
array[i] = Compute(i);
}
它是如何工作的:产生了许多线程(您可以设置数量,它应该默认为您拥有的核心数量),并且每个线程执行循环的一部分。
即:如果 N = 100,并且您有 2 个线程,则线程 1 执行 i = 0 到 49 的 for 循环,线程 2 执行 i = 50 到 99 的循环。
你应该小心多线程。例如,如果数组中后面的元素依赖于前面的元素,那么最终的数组将毫无用处,因为可能会先计算这些后面的元素。
您需要向 gcc 提供 -fopenmp,否则 #pragma 将被视为注释并被忽略(即:主线程将执行所有操作)。