C/C++教程

C++的thread理解

本文主要是介绍C++的thread理解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

C++11引入了最新的thread模块,在对线程的操作上进行了进一步的提升,这里设置全局变量number = 1;

int Thread_A()
{
    while (number < 100)
    {
        //mu.lock(); //同步数据锁  
        cout << "thread A :" << number << endl;
        number++;
        this_thread::sleep_for(chrono::milliseconds(100));
        //mu.unlock();  //解除锁定  
       
    }
    return 0;
}
int Thread_B()
{
    while (number < 100)
    {
        //mu.lock(); //同步数据锁  
        cout << "thread B :" << number << endl;
        number++;
        this_thread::sleep_for(chrono::milliseconds(100));
        //mu.unlock(); //同步数据锁  
    }
    return 0;
}

上方构建了两个函数,分别代表线程A和线程B,分别使用join()方法,这会出现堵塞主线线程和线程访问变量出现问题

int main()
{
    thread a(Thread_A);
    thread b(Thread_B);

    a.join();
    b.join();

    for (int i = 0; i < 10; i++)
    {
        cout << "Main thread is working !" << endl;
        this_thread::sleep_for(chrono::milliseconds(200));
    }
    return 0;
}

此时会出现问题,就是当A线程访问number时候,number已经进行赋值输出但是没有进行++操作的时候线程B访问number变量,这会出现其输出变量与A输出的是一样的,而且++进行两次后A线程输出的number+2了,正如下方的运行

 

 所以为了避免出现该问题需要加上同步锁,也就是上方注释部分此时出现比较完美的结局

 

 但是这个时候又有个问题,join方法会对主线程进行堵塞,所以我们需要用

a.detach();
b.detach();

但是会报错,mutex destroyed while busy,此时是由于线程访问未解锁的number报错。

 

这篇关于C++的thread理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!