C++11 C++;11 std::线程未退出

C++11 C++;11 std::线程未退出,c++11,mutex,condition-variable,stdthread,data-race,C++11,Mutex,Condition Variable,Stdthread,Data Race,请您检查以下代码,即使在条件变为false后也不会退出 我试图通过第一个线程打印从1到10的数字,同样地,通过第二个线程打印从2到20的数字&我有10个线程,每当计数达到100,我的程序应该通过终止所有线程安全地终止。但这并没有发生,在印刷之后,它就出现了,我不明白为什么 是否存在数据竞争?请导游 #include<iostream> #include<vector> #include<thread> #include<mutex> #includ

请您检查以下代码,即使在条件变为false后也不会退出

我试图通过第一个线程打印从1到10的数字,同样地,通过第二个线程打印从2到20的数字&我有10个线程,每当计数达到100,我的程序应该通过终止所有线程安全地终止。但这并没有发生,在印刷之后,它就出现了,我不明白为什么

是否存在数据竞争?请导游

#include<iostream>
#include<vector>
#include<thread>
#include<mutex>
#include<condition_variable>

std::mutex mu;
int count=1;
bool isDone = true;
std::condition_variable cv;

void Print10(int tid)
{
        std::unique_lock<std::mutex> lock(mu);
        while(isDone){
                cv.wait(lock,[tid](){ return ((count/10)==tid);});
                for(int i=0;i<10;i++)
                        std::cout<<"tid="<<tid<<" count="<<count++<<"\n";
                isDone = count<100;//!(count == (((tid+1)*10)+1));
                std::cout<<"tid="<<tid<<" isDone="<<isDone<<"\n";
                cv.notify_all();
        }
}
int main()
{
        std::vector<std::thread> vec;

        for(int i=0;i<10;i++)
        {
                vec.push_back(std::thread(Print10,i));
        }

        for(auto &th : vec)
        {
                if(th.joinable())
                        th.join();
        }

}
#包括
#包括
#包括
#包括
#包括
std::互斥mu;
整数计数=1;
bool-isDone=true;
std::条件变量cv;
无效打印10(内部tid)
{
std::唯一锁(mu);
while(isDone){
cv.wait(lock,[tid](){return((count/10)=tid);});

对于(inti=0;i我相信下面的代码应该适合您

    #include<iostream>
    #include<vector>
    #include<thread>
    #include<mutex>
    #include<condition_variable>
    
    using namespace std;
    mutex mu;
    int count=1;
    bool isDone = true;
    condition_variable cv;
     
    void Print10(int tid)
    {
        unique_lock<std::mutex> lock(mu);
        
        // Wait until condition --> Wait till count/10 = tid
        while(count/10 != tid)
            cv.wait(lock);
        
        // Core logic 
        for(int i=0;i<10;i++)
            cout<<"tid="<<tid<<" count="<<count++<<"\n";
                
        // Release the current thread thus ensuring serailization
        cv.notify_one();
    }
    int main()
    {
        std::vector<std::thread> vec;
    
        for(int i=0;i<10;i++)
        {
            vec.push_back(std::thread(Print10,i));
        }
    
        for(auto &th : vec)
        {
            if(th.joinable())
                th.join();
        }
            
        return 0;
    }

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
互斥mu;
整数计数=1;
bool-isDone=true;
条件变量cv;
无效打印10(内部tid)
{
唯一锁(mu);
//等待条件-->等待计数/10=tid
而(计数/10!=tid)
cv.等待(锁定);
//核心逻辑

对于(int i=0;i将线程与
tid==0
关联。在它完成其工作后,它重新进入while循环,但永远不会再找到
count/10==tid
的条件,因为现在
count>9
,并且永远等待。为什么要等待条件变量?听起来好像你想知道,如果线程没有条件,它如何退出打印10个数字的任务是什么?如果你想让线程在打印完10个数字后退出,那你为什么要在循环过程中执行
?打印你的数字并返回,没有什么需要等待的了。我想订购线程,这就是我等待条件变量的原因