c++ - 加入vector所有线程后程序不稳定不退出

标签 c++ multithreading c++11

我是 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/

相关文章:

c++ - xerces 中的多个 XML 命名空间

c++ - 与 g++ 相比,为什么我的程序在使用 mingw 编译时给出完全不同的输出

c++ - 通过引用将对象传递给C++ 11中的std::thread

c++ - 自动与字符串文字

c++ - 使用 C++ 代码从 C 代码回调?

c++ - 在 C++ 中通过引用和值传递

c++ - 如何修复 OpenMP 程序的 gdb 运行中的线程数

c++ - C++中创建线程的基本问题

c# - 使用 Thread.Sleep 时启动 .NET Windows 服务时出现问题

c++ - 编译时生成一个遗漏的整数序列