2015-11-06 108 views
1

我在使用线程函数查找二维数组中的最大条目时遇到了一些问题。我已经粘在屏幕上好几个小时了,我可以用一些帮助。线程在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应该找到它提供的数组中最大的条目,并且当我创建线程时,我将它们中的每一个都分配给数组的一部分。

任何人可以提供任何意见将不胜感激。

+0

这是[使用线程函数在二维数组中找到最大条目]的后续步骤(http://stackoverflow.com/questions/33535657/finding-largest-entry-in-2d-array-with-threaded-function) OP没有解决那里提到的所有问题。 – 1201ProgramAlarm

回答

2

当前您只是更改本地largestEntry参数的值。这不会改变调用程序中的任何内容。

一种解决方案是在largestEntry通过为基准(改变你的函数说double &largestEntry在其参数列表)

注意,这已经无关,与线程,你可以只调用函数通常对它进行测试。

编辑:我很难用一个参考,当我尝试了(可能只是一个旧的编译器) - 如果引用不工作,你总是可以通过largestEntry作为指针 - 在函数参数列表double *largestEntry和几个*&放置在代码的其余部分。

+0

感谢您的回复。通过引用传递对我来说并不适用,使用线程,我会在代码中的其他位置放置'*'和'&'来传递指针? – slippeel

+0

如果您将参数更改为指针,则需要使用'* largestEntry'(在两处)取消引用函数内的指针。当您调用变量时,您还需要将变量的地址传递给函数。通过使用'&'来做到这一点,例如。 main()函数中的'&largestEntry3'。 –

+0

我根据您的第一条评论对其进行了更改,以使'getLargest'返回一个值而不是更新值,并且我收到了满意的结果。但是,并不像我希望的那样提高速度。 – slippeel

2

这个问题已经在The Dark的最后一个回答中描述过了。但是,我发现解决方案并不理想。对我来说,你的函数返回找到的值比写在参数中更合乎逻辑。

通过这种方式,您可以在线程完成时使用future的get()函数来获取答案,并且不会在真正不需要的地方使用引用或指针。

注意:仅使用参考在此处不起作用,因为复制的参数为std::async,方法与std::thread相同。如果您希望它与参考一起使用,那么在这种情况下,您需要使用std::reflink)。

+0

是的,返回值更有意义,而不是作为参数。 –