我正在尝试了解多线程以及如何使用它来并行执行一组数据上的任务。例如,如果我有一个数字数组,我想执行相当长的操作,我已经创建了以下代码来处理它:
mutex mm;
int nums[] = {10,20,30,40,50,60,70,80,90};
int index = 0;
void threadProc()
{
while (index != sizeof(nums)/sizeof(nums[0])) //While != to end of array
{
mm.lock();
int num = nums[index]; //Create local copy so we can unlock mutex for other threads
index++;
mm.unlock();
cout << num + 2; //Replace with time-consuming function
}
}
int main()
{
//Create 2 threads
thread t(threadProc);
thread a(threadProc);
t.join();
a.join();
}
由于我是根据我看似合乎逻辑的原因创建此代码,这是正确的方法吗?当然,我可以根据CPU的硬件线程数量添加更多线程,但我想在这里提出一般性的想法。如果有任何好的资源(最好是面向C ++),我很高兴听到它们。谢谢!
答案 0 :(得分:2)
通常,您有两种选择:基于线程的并行性或基于任务的并行性。第一种是最传统的方法,pthread和OpenMP就是一个很好的例子。在第二种方法中,您还有一个抽象级别,您可以将并行程序视为映射到线程的一组任务。学习计算模型的一个很好的参考是Cormen算法导论(http://mitpress.mit.edu/sites/default/files/titles/content/9780262033848_sch_0001.pdf)的第27章,一些编程工具是CilkPlus(http://cilkplus.org/),线程构建模块(http://threadingbuildingblocks.org/ ),OpenMP任务(http://openmp.org/wp/)和Microsoft的任务并行库(http://msdn.microsoft.com/en-us/library/dd460717.aspx)。
最后,您可以阅读多处理器编程的艺术(http://www.amazon.com/The-Multiprocessor-Programming-Maurice-Herlihy/dp/0123705916)
答案 1 :(得分:0)
我多年前在OReilly的Pthread编程书中学到了,我在这里也看到它Multithreaded programming C++