将之前调用a()时创建的线程连接到a()中.这可能吗?

Join threads in a() that were created in a previous call of a(). Is this possible?

本文关键字:连接 调用 创建 线程      更新时间:2023-10-16

SOLVED/简短回答:是的,你可以。布格在别的地方。

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

中处理

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

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

我的程序,虽然它可以完美地运行一个线程,但它在任何其他数量的线程中都会出错。

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

添加代码供您查看:

首先。我无法访问调用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()

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

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

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

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

我最初的问题的答案是肯定的。你可以在一个函数中连接之前调用的线程。

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

谢谢大家。你指引我找到了解决办法