1. 程式人生 > >併發,執行緒,程序

併發,執行緒,程序

一個是實力的體現,一個是商用的必須需求。
以往:
windows: CreatThread(),_beginthred(),_beginthredexe()
Linux: pthread_create() 建立執行緒

臨界區,互斥量。以往多執行緒程式碼不能跨平臺。
從C++11開始,C++語言本身增加可移植性。

整個程序是否執行完畢的標誌是主執行緒是否執行完畢。此時,如果主執行緒執行完畢,但是其他子執行緒還沒有執行完畢,那麼,這些子執行緒也會被作業系統強行終止。

1.包含標頭檔案:

#include<thread>

2.建立一個執行緒函式

void myprint()
{
	cout << "執行緒開始執行" << endl;
	//...
	//...
	//...
	cout << "執行緒執行完畢" << endl;
}

3.main中開始寫程式碼

std::thread mythread(myprint);
mythread.join();//阻塞主執行緒,讓主執行緒等待

傳統多執行緒:等待子執行緒執行完畢,然後自己最後在退出。
detach():主執行緒可以不等子執行緒執行完畢,就結束程式。此時子執行緒跑到系統的後臺執行,相當於被C++執行時庫接管,當這個子執行緒執行完成後,由執行時庫負責清理相關資源。
一旦detach(),就不能join(),否則會出現異常。

void myprint()
{
	cout << "執行緒開始執行" << endl;
	cout << "1" << endl;
	cout << "2" << endl;
	cout << "3" << endl;
	cout << "4" << endl;
	cout << "5" << endl;
	cout << "執行緒執行完畢" << endl;
}
std::thread mythread(myprint);
	mythread.detach();//一起列印,但是主執行緒完畢後,就結束程式
	cout << "hello world" << endl;

在這裡插入圖片描述

joinable():判斷能不能使用join或detach。

	std::thread mythread(myprint);
	if(mythread.joinable())
		mythread.join();
	else 
		mythread.detach();
	cout << "hello world" << endl;

在這裡插入圖片描述

執行緒引數:當執行緒引入引數時,是以複製的形式,

class T {
	int i;
public:
	T(int j):i(j)
	{
		cout << "建構函式執行" << endl;
	}
	T(const T &j) 
	{
		i = j.i;
		cout << "拷貝建構函式執行" << endl;
	}
	void operator()()
	{
		cout << "i=" << i << endl;
	}
	~T()
	{
		cout << "解構函式執行" << endl;
	}
};

在這裡插入圖片描述

auto thread = [] {
		cout << "執行緒開始執行" << endl;
	};
	std::thread mythread(thread);
	if(mythread.joinable())
		mythread.join();
	else 
		mythread.detach();
	cout << "hello world" << endl;