<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){
//为了截图方便--加入死循环
}
}
运行结果: