【发布时间】:2013-02-21 12:51:37
【问题描述】:
我有一个程序,其函数将指针作为 arg 和 main。主要是创建 n 个线程,每个线程根据传递的arg 在不同的内存区域上运行函数。然后加入线程,主线程在区域之间执行一些数据混合,并创建 n 个新线程,它们执行与旧线程相同的操作。
为了改进程序,我希望保持线程处于活动状态,从而消除创建线程所需的长时间。线程应该在 main 工作时休眠,并在它们必须再次出现时通知。同样,当线程工作时,main 应该等待,就像它对 join 所做的那样。
我最终无法对此进行强有力的实施,总是陷入僵局。
简单的基线代码,任何关于如何修改它的提示将不胜感激
#include <thread>
#include <climits>
...
void myfunc(void * p) {
do_something(p);
}
int main(){
void * myp[n_threads] {a_location, another_location,...};
std::thread mythread[n_threads];
for (unsigned long int j=0; j < ULONG_MAX; j++) {
for (unsigned int i=0; i < n_threads; i++) {
mythread[i] = std::thread(myfunc, myp[i]);
}
for (unsigned int i=0; i < n_threads; i++) {
mythread[i].join();
}
mix_data(myp);
}
return 0;
}
【问题讨论】:
-
死锁到底在哪里?是在
mythread[i].join();上吗? -
不,这是我现在拥有的无法死锁的代码示例。我找不到更好的实现(不会删除加入它们的线程)不会死锁。
-
你在找thread pools吗?
-
池可能是一个(不明显的)解决方案,但我认为这是一种矫枉过正。我也在寻找一种执行速度非常快且实现简单的方法,大概mutex和conditional_variable应该是第一个尝试的方法。
-
@DarioP - 是的,你做到了,诚实 :)
标签: c++ multithreading c++11 thread-safety