C++11std::thread类的使用

<thread>是C++11标准程序库中的一个头文件,定义了C++11标准中的一些表示线程的类、用于互斥访问的类与方法等。

要使用<thread>头文件,请使用支持C++11标准的编译器如VS2015。

类std::thread表示一个线程。初始化时给出该线程的执行函数(或是可以调用的对象)。线程对象构造后即开始运行。

默认情况下,C++11的子线程必须与主线程会合,即在主线程中调用thread::join()函数,这避免了子线程还在执行,主线程已经执行结束而撤销的情况。当然还有一种detch()模式。

join()为主线程等待子线程的阻塞模式

detach()为主线程不管子线程的非阻塞模式

join()与detch()启动多线程的实际例子:

join()方法启动线程:

#include <thread>
#include <Windows.h>
using namespace std;
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);
    }
}
int main(){
    thread t1(TestThread1);
    t1.join();
    thread t2(TestThread2);
    t2.join();
    printf("主线程:你好帅!!!!\n");
    system("pause");
}

join()方法的意思就是开启子线程,主线程在子线程开启后会阻塞等待子线程运行完,子线程会按照开启的先后顺序同步运行。 
运行结果: 
这里写图片描述 

detch()启动线程:

#include <thread>
#include <Windows.h>
using namespace std;
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);
    }
}
int main(){
    thread t1(TestThread1);
    t1.detach();
    thread t2(TestThread2);
    t2.detach();
    printf("主线程:你好帅!!!!\n");
    system("pause");
}

detch()方法就是开启子线程,并且主线程不等待子线程运行完毕,而是和子线程并行运行。 

运行结果: 
这里写图片描述

子线程函数带有参数的多线程:

#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()
{
}

main函数

#include "ThreadTest.h"
int main(){
    //多线程卖票类
    ThreadTest SaleThread;
    while (true){
        //为了截图方便--加入死循环
    }
}

运行结果: 
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/81772594