我是 c++11 中多线程的新手,我试图在 vector 中实现类似于线程池的功能。但是代码(primeGenStdThread())不稳定。有时,它能够打印输出内容,有时不能。在我加入所有程序后,它 100% 无法退出该程序。谁能确定问题所在?多谢!
std::vector<std::thread> workers;
std::mutex q_mutex;
std::condition_variable condition;
bool stop=false;
bool start=false;
std::queue<std::function<void()>> tasks;
void primeGenStdThread_task(int i);
void primeGenStdThread(){
for (int i=2; i<100; i++){
tasks.push([i](){
primeGenStdThread_task(i);
});
}
for (int i=0; i<4; i++){
std::cout<<"for i " << i << std::endl;
workers.push_back(std::thread([](){
while(true){
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(q_mutex);
condition.wait(lock, []{
return start==true;});
std::cout << "thread " << std::this_thread::get_id() << "task size" << tasks.size()<<std::endl;
if(tasks.empty()){
start=false;
return;
}else{
task = std::move(tasks.front());
tasks.pop();
}
}
task();
}
}));
}
std::cout<<"work size"<<workers.size()<<std::endl;
start=true;
for(std::thread &worker: workers){
worker.join();
}
return;
}
void primeGenStdThread_task(int i){
for (int j=2; j<i; j++)
{
if (i % j == 0)
break;
else if (i == j+1)
;//std::cout << i << " ";
}
}
最佳答案
终于找到原因了。
在设置start为true后添加notifiy_all
并在下面的 if 语句中删除 start=false。
if(tasks.empty()){
start=false;
return;
}
关于c++ - 加入vector所有线程后程序不稳定不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962708/