gpt4 book ai didi

c++ - 在 a() 中加入在先前调用 a() 时创建的线程。这可能吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:43 25 4
gpt4 key购买 nike

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

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

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

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

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

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

添加代码供您查看:

首先。我无权访问调用 a() 的函数。如果不涉及线程,调用者会等到 a() 完成它的计算,然后再次调用它提供下一个 x,y* s。我想做的是并行计算 8 个 a()。如果 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()

最佳答案

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

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

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

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

关于c++ - 在 a() 中加入在先前调用 a() 时创建的线程。这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736745/

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