C++11多线程(一):线程创建,等待,异步

        C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是 ,,,。简介如下:

(1):该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。
(2):该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
(3):该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。
(4):该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。
(5):该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。

      下面介绍C++ 11多线程的使用,代码如下:

/*

C++ 11 多线程

*/

#include "pch.h"
#include 
#include 

using namespace std;


void ThreadProc()
{
	cout << "子线程开始" << endl;
	for (int i = 0; i < 15; i++)
	{
		cout << "子线程输出 >>>> " << i << endl;
	}
	cout << "子线程结束" << endl;
}

int main()
{
	cout << "主线程开始执行" << endl;

	//使用标准库的线程类 std::thread, 包含头文件 #include 
	std::thread th(ThreadProc); 
	th.join(); //阻塞主线程,直到子线程结束才往下执行

	for (int i = 21; i < 38; i++)
	{
		cout << "主线程 >>> " << i << endl;
	}

	cout << "主线程结束" << endl;

	return 0;
}

代码说明

(1)包含头文件 #include 

(2)join()方法

         join会一直阻塞主线程,直到子线程输出后才回到主线程继续执行。以上代码如果不加join()方法,输出的会混乱,主线程结束后,如果子线程还未执行结束,程序会报错。

C++11多线程(一):线程创建,等待,异步_第1张图片

(3)detach方法

        join()方法会阻塞主线程,C++ 11线程提供了detach()方法,主线程,子线程分离执行,但是,主线程运行结束后,子线程会立即结束。

代码如下:

cout << "主线程开始执行" << endl;

std::thread th(ThreadProc);

//th.join();   //阻塞主线程,直到子线程结束才往下执行
th.detach();   //主线程,子线程分离

for (int i = 21; i < 38; i++)
{
    cout << "主线程 >>> " << i << endl;
}

cout << "主线程结束" << endl;
return 0;

运行结果如下

C++11多线程(一):线程创建,等待,异步_第2张图片

        调用detach()方法,分离运行,互不影响。

        注意:使用detach(), 可能会出现主线程结束了,子线程还未执行结束的情况,但程序不会报错,因为是分离执行。使用detach后就不能再用join().

(4)joinable()

   判断是否可以join或者detach. 未使用join或者detach,joinable()返回true, 否则返回false.

bool ret = th.joinable(); //true

th.detach();   //主线程,子线程分离

ret = th.joinable();  //false

 

lambda表达式创建线程

#include 
#include 

using namespace std;


int main()
{
	cout << "main thread run" << endl;

	//使用lambda表达式
	auto lambdathread = [] {
		cout << "lambda thread run ..." << endl;
	};

	std::thread th(lambdathread);
	th.join();

	cout << "main thread end" << endl;

	system("pause");
	return 0;
}

运行如下:

你可能感兴趣的:(C++多线程与线程池)