1. 程式人生 > >c++11 thread類簡單使用

c++11 thread類簡單使用

近日專案需要用到多執行緒,由於之前沒有寫過c++程式碼,經過研究,發現c++11引入了一個多執行緒類,就寫了一個簡單的例子,做個簡單記錄。 –2018年的今天很冷,全球股市暴跌

簡單多執行緒例子:

detch()啟動執行緒:

#include <thread>
#include <Windows.h>
using namespace std;

void TestThread1();
void TestThread2();

int main(){

    thread t1(TestThread1);
    t1.detach();
    thread t2(TestThread2);
    t2.detach();
    printf
("主執行緒:你好帥!!!!\n"); system("pause"); } void TestThread1(){ for (int i = 0; i < 10; i++){ printf("TestThread1:%d\n", i); Sleep(100); } } void TestThread2(){ for (int i = 100; i < 110; i++){ printf("TestThread2:%d\n", i); Sleep(100); } }

說明:detch()方法的意思就是開啟子執行緒,並且主執行緒不等待子執行緒執行完畢,而是和子執行緒並行執行。


執行結果:
這裡寫圖片描述

join()方法啟動執行緒:

#include <thread>
#include <Windows.h>
using namespace std;
void TestThread1();
void TestThread2();

int main(){

    thread t1(TestThread1);
    t1.join();
    thread t2(TestThread2);
    t2.join();
    printf("主執行緒:你好帥!!!!\n");
    system("pause");

}

void
TestThread1(){ for (int i = 0; i < 10; i++){ printf("TestThread1:%d\n", i); Sleep(100); } } void TestThread2(){ for (int i = 100; i < 110; i++){ printf("TestThread2:%d\n", i); Sleep(100); } }

說明:join()方法的意思就是開啟子執行緒,執行緒會按照開啟的先後順序同步執行。
執行結果:
這裡寫圖片描述
子執行緒函式帶有引數的多執行緒:

#include <thread>
#include <Windows.h>

using namespace std;

void TestThread1(int count);
void TestThread2(int start ,int count);

int main(){

    thread t1(TestThread1,10);
    t1.detach();
    thread t2(TestThread2,40,50);
    t2.detach();

    printf("主執行緒:你好帥!!!!\n");
    system("pause");


}

void TestThread1(int count){

    for (int i = 0; i < count; i++){

        printf("TestThread1:%d\n", i);
        Sleep(100);
    }
}
void TestThread2(int start,int count){

    for (int i = start; i < count; i++){

        printf("TestThread2:%d\n", i);
        Sleep(100);
    }
}

執行結果:
這裡寫圖片描述

多執行緒安全訪問共享資料例子(賣票)

ThreadTest.h標頭檔案

#ifndef _THREAD_TEST_H_
#define _THREAD_TEST_H_
#include <stdio.h>
#include <thread>
#include <mutex>
#include <Windows.h>

using namespace std;

class ThreadTest
{
public:
    //賣票執行緒1
    void ThreadTest::Thread1();
    //賣票執行緒2
    void ThreadTest::Thread2();


    ThreadTest();
    ~ThreadTest();

private:
    //票的剩餘數目
    int Sum;

    mutex Mutex;//執行緒鎖

};

#endif // !_THREAD_TEST_H_

ThreadTest.cpp 檔案

#include "ThreadTest.h"

using namespace std;

void ThreadTest::Thread1(){

    for (;;){
        Mutex.lock();//加鎖
        Sleep(10);
        --Sum;

        if (Sum < 0){
            printf("Thrad1——票賣完了\n", Sum);
            break;
        }
        printf("Thrad1——剩餘票數:%d\n", Sum);
        Mutex.unlock();//解鎖

    }

    Mutex.unlock();//解鎖

}


void  ThreadTest::Thread2(){

    for (;;){

        Mutex.lock();//加鎖       
        Sleep(10);
        --Sum;

        if (Sum < 0){
            printf("Thrad2——票賣完了\n");
            break;
        }
        printf("Thrad2——剩餘票數:%d\n", Sum);

        Mutex.unlock();//解鎖
    }

    Mutex.unlock();//解鎖


}

//建構函式
ThreadTest::ThreadTest()
{
    Sum = 50;
    thread t1(&ThreadTest::Thread1,this);
    t1.detach();
    thread t2(&ThreadTest::Thread2,this);
    t2.detach();


}
//解構函式
ThreadTest::~ThreadTest()
{

}

mian函式

#include "ThreadTest.h"

int main(){

    //多執行緒賣票類
    ThreadTest SaleThread;

    while (true){

        //為了截圖方便--加入死迴圈
    }

}

執行結果:
這裡寫圖片描述

希望對您有所幫助!