【发布时间】:2013-04-04 03:54:14
【问题描述】:
我正在使用 Visual Studio 2012。我有一个模块,在通过 xml 遍历它们的相应路径后,我必须从硬盘读取大量文件。为此我正在做
std::vector<std::thread> m_ThreadList;
在一个while循环中,我将一个新线程推回到这个向量中,类似于
m_ThreadList.push_back(std::thread(&MyClass::Readfile, &MyClassObject, filepath,std::ref(polygon)));
我的 C++11 多线程知识有限。我在这里遇到的问题是,如何在特定内核上创建线程?我知道vs2012中的parallel_for和parallel_for_each,它们可以充分利用内核。但是,有没有办法使用标准 C++11 做到这一点?
【问题讨论】:
-
C++ 线程函数不知道“核心”,因此您无法将线程绑定到特定核心。
-
作为一般提示,如果您使用多个线程从同一文件系统上的多个文件中读取,您很可能会使程序变慢,因为操作系统具有每次有线程上下文切换时来回寻找。 (至少在旧的机械硬盘上,现代 SSD 应该能更好地处理这个问题。)
-
如果这真的只是关于“我不希望我的 4 个线程最终都在同一个内核上”。那么简单的答案是“拜托,您使用的操作系统完全了解多核处理器,而且还没有那么笨”。但是,如果问题是 “我希望线程 2 在核心 3 上运行”(无论出于何种原因,这对于 “正常” 应用程序中的多核来说都是必要的),那么您就可以受平台相关功能的支配了。
-
顺便说一句,如果你有 100 个文件,你会启动 100 个线程吗?祝你好运。
标签: c++ multithreading concurrency c++11 visual-studio-2012