Visual Studio CodeC++

Vscode搭建c++11多线程环境--Apple的学习笔记

2019-05-02  本文已影响10人  applecai

我的minGW用pthread是ok的,但是用C++11的std中的thread类就提示找不到。网上查了下,重新安装MinGW。
MinGW 8.1 64bit安装包:https://sourceforge.net/projects/mingw-w64/

顺便复习下互斥锁,编写个我和老爸老妈3个人抢爱默生打印机的情况,哈哈~

程序设计:

1. 用主程序main循环创建3个子线程(每个线程代表一个人物的打印行为)。
2. 子线程中执行打印动作。包括设置延时及打印多张内容。
3. PARALLEL作为其可配置项,注释掉后则为子线程顺序执行。
若在主程序的for循环添加了join,则阻塞了主程序,是一个个子程序按顺序执行。
若设置多个子线程并发运行,则需要添加互斥锁,因为只有一个打印机。

main.cpp文件

    #include <iostream>
    #include <thread>
    #include <ctime>
    #include <cstdlib>
    #include <mutex>
    #include <chrono>
    using namespace std;
    #define PARALLEL    /* configration */
    
    #ifdef PARALLEL
    mutex g_mutex;
    #endif
    class mywork
    {
    public:
        void do_some_work(string people,string myinfo);
    private:
        int _cnt=0;
        void EP220_print(string myinfo);
    };
    
    void mywork::EP220_print(string myinfo)
    {
        _cnt++;
        cout<<"EP220累计打印"<<_cnt<<"张,本次打印内容为"<<myinfo<<endl;
    }

    void mywork::do_some_work(string people,string myinfo)
    {
        #ifdef PARALLEL
        /* 进入时候上锁,退出时候自动解锁 */
        lock_guard<mutex> lock(g_mutex);
        cout<<"PARALLEL"<<endl;
        #else
        cout<<"SERIAL"<<endl;
        #endif
        /* 每个人的打印速度不同,添加延时,这样times的值也会不同 */
        std::this_thread::sleep_for(std::chrono::seconds(rand() % 10));
        int times;
        srand(int(time(0)));
        times = rand()%10+1;
        for(int i=0;i<times;i++)
        {
            cout<<people<<"在用打印机,第"<<i+1<<"次打印,共打印"<<times<<"张"<<endl;
            mywork::EP220_print(myinfo);
        }
    }
    
    int main()
    {
        mywork node;
        string peoplelist[3]={"爸爸","妈妈","我"};
        string infolist[3]={"照片","菜谱","学习资料"};
        thread t;
        for (int i =0;i<3;i++)
        {
            thread t(&mywork::do_some_work, &node,peoplelist[i],infolist[i]);
            #ifdef PARALLEL
            t.detach();
            #else
            t.join();   /* 用join阻塞主线程进入next for循环,则子线程是按顺序进入的 */
            #endif
        }
        /* 若不加getchar等待,而主线程不阻塞,则子线程都不运行直接退出了 */
        getchar();  
        return 0;
    }

CMakeList.txt文件

    cmake_minimum_required( VERSION 2.8 )
    
    # 声明一个 cmake 工程
    PROJECT(Pthread_test CXX)
    # 设置编译模式
    set( CMAKE_BUILD_TYPE "Debug" )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 " )
    add_executable( main main.cpp)

运行结果

D:\ws\thread\build>main.exe
PARALLEL
爸爸在用打印机,第1次打印,共打印8张
EP220累计打印1张,本次打印内容为照片
爸爸在用打印机,第2次打印,共打印8张
EP220累计打印2张,本次打印内容为照片
爸爸在用打印机,第3次打印,共打印8张
EP220累计打印3张,本次打印内容为照片
爸爸在用打印机,第4次打印,共打印8张
EP220累计打印4张,本次打印内容为照片
爸爸在用打印机,第5次打印,共打印8张
EP220累计打印5张,本次打印内容为照片
爸爸在用打印机,第6次打印,共打印8张
EP220累计打印6张,本次打印内容为照片
爸爸在用打印机,第7次打印,共打印8张
EP220累计打印7张,本次打印内容为照片
爸爸在用打印机,第8次打印,共打印8张
EP220累计打印8张,本次打印内容为照片
PARALLEL
妈妈在用打印机,第1次打印,共打印1张
EP220累计打印9张,本次打印内容为菜谱
PARALLEL
我在用打印机,第1次打印,共打印4张
EP220累计打印10张,本次打印内容为学习资料
我在用打印机,第2次打印,共打印4张
EP220累计打印11张,本次打印内容为学习资料
我在用打印机,第3次打印,共打印4张
EP220累计打印12张,本次打印内容为学习资料
我在用打印机,第4次打印,共打印4张
EP220累计打印13张,本次打印内容为学习资料

若用并发,不加互斥,运行结果如下

D:\ws\thread\build>main.exe
PARALLELPARALLEL
PARALLEL

爸爸我在用打印机,第妈妈在用打印机,第在用打印机,第111次打印,共打印次打印,共打印次打印,共打印11张张1

张
EP220累计打印2EP220累计打印张,本次打印内容为学习资料2
张,本次打印内容为菜谱
EP220累计打印3张,本次打印内容为照片
上一篇下一篇

猜你喜欢

热点阅读