在c++中进行线程处理,在2d数组中找到最大的条目
threading in c++, finding largest entry in 2d array
我在使用线程函数的2d数组中查找最大条目时遇到了一些问题。我已经粘在屏幕上好几个小时了,我需要一些帮助。
这是代码:
#include <iostream>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <random>
#include <ctime>
#include <future>
#include <thread>
using namespace std;
// A vanilla random number generator
double genRandNum(double min, double max){
return min + (rand() / (RAND_MAX / (max - min)));
}
double get_wallTime() {
struct timeval tp;
gettimeofday(&tp, NULL);
return (double) (tp.tv_sec + tp.tv_usec/1000000.0);
}
void getLargest(double** anArray, double largestEntry, int dimLower, int dimUpper, int dim) {
for (int i = dimLower; i < dimUpper; i++) {
for (int j = 0; j < dim; j++) {
if (anArray[i][j] > largestEntry) {
largestEntry = anArray[i][j];
}
}
}
}
// Main routine
int main(){
// Seed the random number generator
srand( time(NULL));
// 2D array dimension
int dim = 30000;
// Specify max values
double max = (double) (dim * dim * dim);
double min = (double) (dim * dim * dim * -1.0);
double t1 = get_wallTime();
// Create a 2D array
double **myArray = new double*[dim];
for (int i=0; i<dim; i++){
myArray[i] = new double[dim];
for (int j=0; j<dim; j++){
// generate random number
myArray[i][j] = genRandNum(min, max);
}
}
double largestEntry = 0.0;
double largestEntry2 = 0.0;
double largestEntry3 = 0.0;
double largestEntry4 = 0.0;
double largestEntry5 = 0.0;
int portion = dim / 5;
std::future<void> thread1 = std::async (std::launch::async, getLargest, myArray, largestEntry, 0, portion, dim);
std::future<void> thread2 = std::async (std::launch::async, getLargest, myArray, largestEntry2, portion, (portion * 2), dim);
std::future<void> thread3 = std::async (std::launch::async, getLargest, myArray, largestEntry3, (portion * 2), (portion * 3), dim);
std::future<void> thread4 = std::async (std::launch::async, getLargest, myArray, largestEntry4, (portion * 3), (portion * 4), dim);
std::future<void> thread5 = std::async (std::launch::async, getLargest, myArray, largestEntry5, (portion *4), dim, dim);
thread1.get();
thread2.get();
thread3.get();
thread4.get();
thread5.get();
if (largestEntry2 > largestEntry) {
largestEntry = largestEntry2;
}
if (largestEntry3 > largestEntry) {
largestEntry = largestEntry3;
}
if (largestEntry4 > largestEntry) {
largestEntry = largestEntry4;
}
if (largestEntry5 > largestEntry) {
largestEntry = largestEntry5;
}
double t2 = get_wallTime();
double t3 = t2 - t1;
cout << " The largest entry is " << largestEntry << endl;
cout << "runtime : " << t3 << "n";
}
我相信我已经正确地设置了所有内容,但我刚刚学会了如何使用异步,所以我确信有些地方不正确。当运行时,我得到零作为最大条目的输出,这是错误的,并且我得到的运行时间比我预期的要长得多。
这是输出:
The largest entry is 0
runtime : 13.8261
我认为我将largestEntry
错误地传递给线程函数,但我不知道如何修复它。线程函数getLargest
应该找到它所提供的数组中最大的条目,当我创建线程时,我会为每个线程分配数组的一部分。
任何人能提供的建议都将不胜感激。
当前您只是在更改本地largestEntry
参数的值。这不会改变调用程序中的任何内容。
一种解决方案是传入largestEntry
作为参考(将函数更改为参数列表中的double &largestEntry
)
请注意,这与线程无关,您可以正常调用函数来测试它
编辑:我在尝试使用引用时遇到了问题(可能只是一个旧的编译器)-如果引用不起作用,你总是可以将largestEntry
作为指针传递-函数参数列表中的double *largestEntry
以及代码其余部分中的一些*
和&
。
The Dark在最后一个答案中描述了这个问题。然而,我发现解决方案并不理想。对我来说,更合乎逻辑的是,您的函数返回这样找到的值,而不是将其写入参数中。
这样,当线程完成时,可以使用future
的get()函数来获得答案,并且在真正不需要的地方不使用引用或指针。
注意:简单地使用引用在这里是不起作用的,因为std::async
的参数是复制的,与std::thread
的方法相同。如果您希望它与引用一起使用,那么在这种情况下需要使用std::ref
(链接)。
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数