已解决/简短回答:是的,您可以。虫子在别的地方。如果您想知道它在哪里,请继续阅读。
我必须处理项目(在项目之间进行独立的计算)。项目在函数 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()