C++为线程工作动态地分割例程
C++ dynamically splitting a routine for thread work
下面的C++DoWork1例程计算0到1000之间的每个数字的总和。我们有没有办法动态创建4个版本,每个版本都有不同的四分之一范围,即0-(250-1(、250-(500-1(、500-(750-1(和750-1000?
void DoWork1() {
int n1 = 0;
int p1 = 0;
for (int p1 = 0; p1 <= 1000; p1++)
n1 = n1 + p1;
}
这是为引入线程工作做准备,最终目的是将上述例程动态拆分为最大数量的可用线程,以实现最快的执行时间。我试着让事情尽可能简单,因此作为一名首发球员,我有了这个基本的常规。我知道如果使用相同的变量,可能会出现并发问题——一旦我知道是否有办法实现上述目标,我就可以对此进行更多的研究(除非在本例中可以相对容易地克服并发问题(。
这里有一个基于std::thread
的简单解决方案。毫无疑问,您可以根据自己的需求进行调整:
#include <iostream>
#include <thread>
#include <functional>
void sum (int from, int to, int &total_out)
{
int total = 0;
for (int i = from; i < to; ++i)
total += i;
total_out = total;
}
int main() {
int sum1, sum2, sum3, sum4;
std::thread t1 (sum, 0, 250, std::ref (sum1));
std::thread t2 (sum, 250, 500, std::ref (sum2));
std::thread t3 (sum, 500, 750, std::ref (sum3));
std::thread t4 (sum, 750, 1000, std::ref (sum4));
t1.join ();
t2.join ();
t3.join ();
t4.join ();
std::cout << sum1 << ", " << sum2 << ", " << sum3 << ", " << sum4;
}
返回线程结果的另一种机制是使用std::future
,如本文所述。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- c++类声明时,相同的例程,不同的成员变量类型
- C++为线程工作动态地分割例程
- 子例程,不使用 pow,并带有参数和返回
- 直接在RcppArmadillo中调用LAPACK例程
- 如何将C++子例程链接到 x86 程序集程序?
- PX 转换例程编译问题
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 只允许授权代码调用库中的例程
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 调用子例程时类型不匹配
- 将分配给C++数组传递给 Fortran 子例程
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- Posix 线程类和启动例程 (pthread)
- OpenBLAS 只为一个例程设置线程数
- 检查并行化 BLAS 例程的结果
- 我们应该测量例程的平均执行时间还是最小执行时间?
- 试图在C 中调用Fortran子例程
- C++ 我的函数在我的 Image 类中工作,但不在主例程中工作
- 拉帕克例程DSTEV中的分割故障