一个功能可以在几个线程上运行
Can one function operate on few threads?
我有一个关于线程的问题。例如,我有这样的代码
void xyz(int x){
...
}
int main{
for(int i=0;i<n;i++){
xyz(n);
}
}
问题是,我是否可以模仿代码(以及如何?),以便首先将参数1至n/2的函数调用一个函数,第二个线程调用一个函数,该函数的参数为n/2到n。
预先感谢您
这是一个使用std::async
的简单解决方案,lambda函数捕获您的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;
}
每个呼叫std::async
都会创建一个新线程,然后在由Async返回的std::future
s上调用wait()
,请确保该程序在完成这些线程之前不会返回。
当然。您可以使用<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
。)
您应该阅读有关多线程的一些教程。我推荐此Pthread教程,因为您可以将概念应用于C 11线程(其模型接近Posix线程)。
如果函数是重入的,则可以在多个线程中使用。
您可能会与静音的关键部分同步,并使用条件变量。您应该避免进行数据竞赛。
在某些情况下,您可以使用原子操作。
(您的问题太广泛且不清楚;需要整本书来回答它)
您可能也对OpenMP,OpenACC,Opencl。
感兴趣请注意,线程是非常昂贵的资源。每个人都有自己的呼叫堆栈(一个或几个兆字节),并且通常不希望拥有比可用内核更多的可运行线程。根据经验,避免(在通用台式机或笔记本电脑上)具有超过十几个可运行的线程(以及数百多个空闲的线程,可能更少)。但是ymmv;我更喜欢少于十二个线程,而我试图比std::thread::hardware_concurrency
所提供的线程更少。
Nikos C的答案和MarošBeťko的两个答案都使用了两个线程。您可以再使用几个,但是使用更多的数量(例如一百个线程),至少在某些普通计算机上可能是不合理且效率低下的。最佳螺纹量是计算机(以及软件和系统)特定的。您可以使其成为程序的可配置参数。在超级计算机上,您可以将多线程与某些MPI方法混合。在数据中心或集群上,您可以考虑一种MapReduce方法。
基准测试时,不要忘记启用编译器优化。如果使用GCC或Clang,则至少使用-O2 -march=native
编译。
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何返回或护理项目清单基于几个类别
- 我们如何在文本文件中找到C++中的几个单词?
- 关于 std::bitset 构造函数的几个问题?
- 几个 Nt 函数在 Windows 7 x32 上返回STATUS_WAIT_0
- std::stoi 只转换前几个字符
- C++ 通过接口使用从其他几个类继承的类
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 我有几个关于参考变量的问题
- 如何将几个变量复制到其他变量
- 如何在新设计中迁移需要几个额外参数的函数
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 如何在几个空行后打印文件中的输出
- recvfrom 只收到几个数据包,之后它进入等待状态
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 一个功能可以在几个线程上运行
- 我的程序在运行时不会打印任何内容,输入几个随机数后它会工作(有很多错误)
- 在Windows上编译和运行示例c++程序的几个问题