我希望并行运行(不兼容)4线程完成独立的事情。我是平行主义的新手,我有几个问题。我想这样做的原因是因为性能对我来说非常重要。我正在使用4核Windows机器,并且我在Visual Studio Community 2015中使用C ++。
1.我应该尝试自己调度线程,以便每个线程运行在不同的核心上,还是应该让OS Scheduler执行此操作?在我看来,我认为如果我强制它在不同的核心上运行每个线程会更快。我怎么能这样做?
这是我到目前为止所尝试的:
#include <thread>
void t1(){//do something}
void t2(){//do something}
void t3(){//do something}
void t4(){//do something}
int main(){
std::thread thread1(t1);
std::thread thread2(t2);
std::thread thread3(t3);
std::thread thread4(t4);
t1.join();
t2.join();
t3.join();
t4.join();
}
我知道join()会阻塞线程直到完成。但我不确定它是否并行运行线程?我的代码是同时还是并行执行线程??请给我一个例子或推荐一个教程。如果可能,不使用外部库。
由于
编辑:
并发基本上是在同时执行两个任务的时候。这可能意味着一个人暂停了#39;持续时间很短,而另一个正在进行中
并行性要求在特定时刻至少执行两个进程/任务。
答案 0 :(得分:6)
你完成了,不需要安排任何事情。只要有多个处理器可用,您的线程就会在可用内核上同时运行。
如果可用的处理器少于4个,例如2,则线程将以交错方式运行,在任何给定时间最多运行2个。
P.S。它也很容易为自己体验 - 只需制作4个无限循环并在4个不同的线程中运行它们。您将看到正在使用4个CPU。
免责声明:当然,&#34;引擎盖&#34;,操作系统正在为您完成的调度。因此,您依赖于内置于操作系统中的调度程序的质量以实现并发性。内置于运行C ++应用程序的操作系统中的调度程序的公平性超出了C ++标准,因此无法保证。实际上,尤其是在学习编写并发应用程序时,大多数现代操作系统都会在线程调度中提供足够的公平性。
答案 1 :(得分:3)
没有标准的方法来设置给定线程的亲和力,在引擎盖下std :: thread是使用linux / unix上的posix线程和Windows下的windows线程实现的。解决方案是使用本机apis,例如在windows下面代码将导致我的i7 CPU的所有8个内核的充分利用:
auto fn = []() {while (true);};
std::vector<std::thread> at;
const int num_of_cores = 8;
for (int n = 0; n < num_of_cores; n++) {
at.push_back(std::thread(fn));
// for POSIX: use pthread_setaffinity_np
BOOL res = SetThreadAffinityMask(at.back().native_handle(), 1u << n);
assert(res);
}
for (auto& t : at) t.join();
但在评论SetThreadAffinityMask
之后我仍然得到相同的结果,所有核心都得到了充分利用,因此Windows调度程序做得很好。
如果您希望更好地控制系统内核,请查看OpenMP,TBB(Thread Building Blocks),PPL等库。按此顺序。
答案 2 :(得分:-1)
好吧,如果您愿意,可能需要设置应用程序关联。基本上,如果你有类似i7 CPU和4cores / 8threads的东西,如果你为每个核心(不是每个线程)设置一个线程的亲和力,你的应用会更快。
有命令行工具:Set affinity with start /AFFINITY command on Windows 7
此外,可以通过任务管理器设置亲和力:http://www.windowscentral.com/assign-specific-processor-cores-apps-windows-10