我在使用线程函数查找二维数组中的最大条目时遇到了一些问题。我已经粘在屏幕上好几个小时了,我可以用一些帮助。线程在C++中,查找二维数组中的最大条目
下面是代码:
#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
应该找到它提供的数组中最大的条目,并且当我创建线程时,我将它们中的每一个都分配给数组的一部分。
任何人可以提供任何意见将不胜感激。
这是[使用线程函数在二维数组中找到最大条目]的后续步骤(http://stackoverflow.com/questions/33535657/finding-largest-entry-in-2d-array-with-threaded-function) OP没有解决那里提到的所有问题。 – 1201ProgramAlarm