如何确保在多核中创建std :: thread?

Atu*_*tul 6 c++ concurrency multithreading c++11 visual-studio-2012

我正在使用visual studio 2012.我有一个模块,在通过xml遍历相应的路径后,我必须从硬盘中读取一大堆文件.为此我正在做

std::vector<std::thread> m_ThreadList;
Run Code Online (Sandbox Code Playgroud)

在一个while循环中,我将一个新线程推回到这个向量中,类似于

m_ThreadList.push_back(std::thread(&MyClass::Readfile, &MyClassObject, filepath,std::ref(polygon)));
Run Code Online (Sandbox Code Playgroud)

我的C++ 11多线程知识是有限的.我在这里的问题是,如何在特定核心上创建一个线程?我知道vs2012中的parallel_for和parallel_for_each,可以充分利用内核.但是,有没有办法使用标准C++ 11?

blu*_*rni 5

正如其他评论中所指出的,您无法“在特定核心上”创建线程,因为 C++ 不了解此类架构细节。此外,在大多数情况下,操作系统将能够很好地管理内核/处理器之间的线程分配。

也就是说,在某些情况下,强制在内核之间进行特定的线程分配可能有利于性能。例如,通过强制线程在一个特定核心上执行,可以最大限度地减少不同处理器缓存之间的数据移动(这对于某些内存限制场景中的性能至关重要)。

如果您想走这条路,您将必须研究特定于平台的例程。例如,对于具有 POSIX 线程的 GNU/linux,您将需要pthread_setaffinity_np()在 FreeBSD 中cpuset_setaffinity()、在 WindowsSetThreadAffinityMask()中等。

如果您有兴趣,我这里有一些相关的代码片段:

http://gitorious.org/piranhapp0x/mainline/blobs/master/src/thread_management.cpp