2

已解决/简短回答:是的,您可以。虫子在别的地方。如果您想知道它在哪里,请继续阅读。

我必须处理项目(在项目之间进行独立的计算)。项目在函数 a() 中处理;

我想要做的是每当调用 a() 时,创建一个包含所有 a() 处理代码的新线程,然后立即退出 a()。下次将调用 a() (由我无权访问的调用者立即调用),将再次创建一个新线程并终止。当进行了 8 个后续调用(我有 8 个内核)时,在 a() 中加入之前的 8 个线程并继续...

这可能吗?我可以加入在先前调用 a() 中创建的 a() 线程内吗?

我的程序,虽然它在 1 个线程上完美运行,但它在任何其他数量上都会出错。

==================================================== ================================

添加代码供您查看:

首先。我无权访问调用 a() 的函数。如果不涉及线程,调用者会等到 a() 完成它的计算,然后再次调用它,提供下一个 x,y* s。我想做的是并行计算 8 个 a()s。如果 a() 可以开始计算并返回(创建线程并退出),调用者将使用新的 x,y* 再次调用 a(),而旧的仍在计算中。这就是概念。每个 x,y* 对的计算完全独立于任何其他对。

int counter = 0;
pthread_t threads[8]; //i have 8 cores
thread_args args[8]; //arguments that pass to the threads
int res[8]; //threads store their results here

void a(int x, int y*) { //a() is being called by caller immediately after it returns with a new pair of x,y*
    args[counter].x = x; //struct thread_args has x,y,my_counter
    args[counter].y = y;
    args[counter].my_counter = counter;
    pthread_create(&threads[counter], NULL, calculate_xy, (void *)&args[counter]);
    //calculate_xy stores results in res[args->my_counter]     

    if(++counter != 8)
        return;

    //it reaches here every 8th call of a(); (total number of a() calls is an exact multiple of 8)
    counter = 0;
    for (int i = 0; i < 8; ++i)
        pthread_join(threads[i], NULL);

    //GO ON... append the 8 results to a text and go on...
}//end a()
4

2 回答 2

0

首先,无论您的代码中有什么错误,这都是一个糟糕的设计。您的函数a()具有全局状态(过去创建的线程和到目前为止创建的数量),这在单线程程序中已经够糟糕了,但在多线程程序中,如果多个线程可以同时调用a(). 即使不是,也有很多理由避免使用全局状态:

http://www.youtube.com/watch?v=-FRm3VPhseI

一个更好的设计是让a()函数接受一个额外的参数,一个指向包含计数器的结构的指针和一个pthread_t迄今为止创建的所有线程的值数组。然后,“状态a()”将不是全局状态,而是属于使用 的程序部分的状态a()

至于为什么你的程序现在崩溃了,没有看到任何代码都很难说。我怀疑您要么a()在没有同步的情况下从多个线程调用,要么只是在数组索引的某处出现粗心的错误/错字...

于 2013-04-01T03:42:47.930 回答
0

我原来的问题的答案是肯定的。您可以在函数中加入线程,这些线程是在先前调用同一函数时创建的。

我的代码中的错误是每次调用 a() 时 y* 指向的地方都会在调用者内部重用。所以,虽然我认为以前创建的线程仍然在正确地完成它们的工作,但它们并不是因为在它们的生命中,y* 参数指向的位置被反复重写,在每次来自调用者的新 a() 调用中,其内容接下来的 x,y* 对混乱线程的计算。

谢谢你们。你引导我解决问题。

于 2013-04-02T01:57:35.023 回答