我对线程有疑问。 例如,我有这样的代码
void xyz(int x){
...
}
int main{
for(int i=0;i<n;i++){
xyz(n);
}
}
问题是我是否可以使用modife代码(以及如何?)以便第一个线程调用带有参数1到n / 2的函数,第二个线程调用一个参数从n / 2到n的函数。
提前谢谢
答案 0 :(得分:1)
这是一个使用n
的简单解决方案和一个捕获#include <future>
int main() {
size_t n = 666;
auto f1 = std::async(std::launch::async, [n]() {
for (size_t i = 0; i < n / 2; ++i)
xyz(i);
});
auto f2 = std::async(std::launch::async, [n]() {
for (size_t i = n/2; i < n; ++i)
xyz(i);
});
f1.wait();
f2.wait();
return 0;
}
的lambda函数:
std::async
每次调用wait()
都会创建一个新线程,然后在异步返回的std::future
上调用equals
,确保程序在这些线程完成之前没有返回。
答案 1 :(得分:1)
不确定。您可以使用<thread>
:
#include <thread>
// The function we want to execute on the new thread.
void xyz(int start, int end)
{
for (int i = start; i < end; ++i) {
// ...
}
}
// Start threads.
std::thread t1(xyz, 1, n / 2);
std::thread t2(xyz, n / 2, n);
// Wait for threads to finish.
t1.join();
t2.join();
如果您正在使用GCC或Clang,如果您收到链接错误,请不要忘记将-pthread
附加到您的链接命令(例如:gcc -std=c++14 myfile.cpp -pthread
。)
答案 2 :(得分:0)
您应阅读有关multi-threading 的一些教程。我推荐这个Pthread tutorial,因为您可以将概念应用于C++11 threads(其模型接近POSIX threads)。
如果函数是reentrant,则可以在多个线程中使用该函数。
您可以与mutexes critical sections同步,并使用condition variables。你应该避免使用data races。
在某些情况下,您可以使用atomic operations。
(你的问题太宽泛而且不清楚;需要整本书来回答它)
您可能也会对OpenMP,OpenACC,OpenCL感兴趣。
请注意,线程是非常昂贵的资源。每个都有自己的call stack(一个或几兆字节),并且您通常不希望拥有比可用的cores更多的可运行线程。根据经验,避免(在普通台式机或笔记本电脑上)拥有十几个可运行的线程(以及几百个空闲线程,可能更少)。但是YMMV;我更喜欢拥有不到12个线程,并且我尝试的线程少于std::thread::hardware_concurrency
给出的线程。
答案from Nikos C.和from Maroš Beťko都使用两个主题。你可以使用更多,但是使用它们中的更多(例如一百个线程)可能是不合理和低效的,至少在一些普通的计算机上。最佳线程数量是计算机(和软件和系统)特定的。您可以将其作为程序的可配置参数。在supercomputers上,您可以将多线程与一些MPI方法混合使用。在数据中心或群集上,您可能会考虑使用MapReduce方法。
进行基准测试时,请勿忘记启用compiler optimizations。如果使用GCC或Clang,请至少汇编with -O2 -march=native
。