我是c ++ 11中多线程的新手,我尝试在向量中实现类似于线程池的函数。但代码(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 << " ";
}
}
答案 0 :(得分:1)
终于找到了原因。
在将start设置为true后添加notifiy_all
并在下面的if语句中删除start = false。
if(tasks.empty()){
start=false;
return;
}