C++多线程代码实例

1. 本次调试代码用的是codeblocks16.01,需先配置好编译器

进入Setting->Compiler,勾选图示选项,点击确定。
C++多线程代码实例_第1张图片

2. 代码段

#include 
#include 
#include 
using namespace std;

void Fun_1();          //声明分支线程函数Fun_1()
void Fun_2();          //声明分支线程函数Fun_2()

unsigned int counter = 0;      //定义变量counter,通过变量counter的变化来观察线程同步情况
std::mutex mtx;           //定义mutex类的对象mtx构造互斥元,互斥占有一个变量,一段时间内仅一个线程可以访问

int main()
{
    std::thread thrd_1(Fun_1);     //创建线程thrd_1,thrd_1调用函数Fun_1
    std::thread thrd_2(Fun_2);     //创建线程thrd_2,thrd_2调用函数Fun_2
    thrd_1.join();        //join()函数启动子线程而阻塞主线程,子线程会按照开启的先后顺序同步运行,当子线程运行结束后,才会继续运行主线程
    thrd_2.join();        //启动线程thrd_2,并且阻塞主线程,等到线程thrd_2运行结束后,再继续运行主线程;
    cout<<"counter= "<< counter < mtx_locker(mtx);    
        counter++;
        if (counter < 20)
            cout << "Function 1 counting !  counter=" << counter << endl;
        else
            break;
    }
}

void Fun_2()
{
    while (true)
    {
     /*std::lock_guard类模板,用于自动锁定解锁,直到对象作用域结束。在 lock_guard 对象构造时,传入的mutex对象 mtx 会被当前线程锁住。在lock_guard 对象被析构时,它所管理的mutex对象mtx会自动解锁*/
        std::lock_guard mtx_locker(mtx);   
        counter++;
        if (counter < 20)
            cout << "Function 2 counting !  counter=" << counter << endl;
        else
            break;
    }
}

在代码中使用了C++标准库的thread、mutex头文件。而且在两个分支线程关联的函数中加了一句 std::lock_guardstd::mutex mtx_locker(mtx)。 在C++中,通过构造std::mutex的实例来创建互斥元,可通过调用其成员函数lock()和unlock()来实现加锁和解锁,但是在离开函数的每条代码路径上都需要调用unlock(),会很不方便。因此作为替代,标准库提供了std::lock_guard类模板,实现了互斥元资源获取。该对象在构造时锁定所给的互斥元,析构时解锁该互斥元,从而保证被锁定的互斥元始终被正确解锁。可见得到了正确的结果。

3. 运行结果

C++多线程代码实例_第2张图片

4. 总结
多线程能使多个任务同时进行,但处理不好的话有可能会导致数据的不同步。
就我个人感觉而言,只是字面学习理论的话会感觉到很抽象,所以要动手实践,通过代码来理解线程的同步问题,会对学习多线程有很大的帮助。

你可能感兴趣的:(操作系统)