gpt4 book ai didi

c++ - c++中的线程,在二维数组中找到最大的条目

转载 作者:行者123 更新时间:2023-11-30 01:46:12 26 4
gpt4 key购买 nike

我在使用线程函数查找二维数组中的最大条目时遇到了一些问题。我已经盯着屏幕好几个小时了,我需要一些帮助。

代码如下:

#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 在函数参数列表中,一些 *& 放在代码的其余部分。

关于c++ - c++中的线程,在二维数组中找到最大的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33559295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com