将之前调用a()时创建的线程连接到a()中.这可能吗?
Join threads in a() that were created in a previous call of a(). Is this possible?
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()
,事情可能会变得非常错误。即使没有,也有很多理由避免全局状态:
一个更好的设计是让a()
函数接受一个额外的参数,一个指向包含计数器和pthread_t
值数组的结构的指针,用于到目前为止创建的所有线程。那么,"a()
的状态"将不是全局状态,而是属于使用a()
的程序部分的状态。
至于为什么你的程序现在崩溃了,在没有看到任何代码的情况下很难说。我怀疑你要么从多线程调用a()
没有同步,或者只是有一个粗心的错误/错字在你的数组索引的某个地方…
我最初的问题的答案是肯定的。你可以在一个函数中连接之前调用的线程。
我代码中的bug是每次调用a()时,y*所指向的位置在调用者内部被重用。所以,虽然我认为以前创建的线程仍然在正确地完成它们的工作,但它们并不是,因为在它们的生命周期中,y*参数指向的地方被反复重写,在调用者的每个新的a()调用中都包含下一个x的内容,y*对会扰乱线程的计算。
谢谢大家。你指引我找到了解决办法
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- QT 连接没有要调用的匹配功能
- 如何在 boost asio 中检测套接字上的关闭连接,而无需阻塞调用
- 如何将 Unicode 字符串连接成字符串以传递到 mysql 调用中
- 从第二个线程调用Qt信号有效 - >对连接的插槽没有影响
- 如何使用 lamba 作为连接处理程序调用 boost async_connect 作为成员函数
- Qt - 没有匹配函数可以调用以进行连接
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 通过直接连接或排队连接调用插槽的QTimer超时插槽之间的区别
- 如何连接字符串并传递给 system() 调用
- Qt - 没有匹配函数来调用连接
- 如何使用Qt连接函数调用Shell Execute
- Qt的连接调用本身线程安全吗?
- 尽管连接成功,但未调用插槽
- 如何强制 Windows 蓝牙连接() 调用超时
- 调用的对象已与其客户端断开连接
- 如何在Qt中安全地调用断开连接
- C++MySQL连接器无法在sql::Connection close()调用上断开TCP连接