程序不稳定,并且在加入向量的所有线程后不退出

时间:2018-04-22 05:12:40

标签: c++ multithreading c++11

我是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 << " ";

        }
}

1 个答案:

答案 0 :(得分:1)

终于找到了原因。

在将start设置为true后添加notifiy_all

并在下面的if语句中删除start = false。

if(tasks.empty()){
    start=false;
    return;
}