1. 程式人生 > >理解多執行緒(二)

理解多執行緒(二)

前言

上篇已經講到,執行緒間的同步,和執行緒訪問公用資料安全是存在問題的。這篇主要理解C++11標準上處理這些問題的方法。

std::thread

c++通過std:thread操作執行緒,因此使用 std::thread 時需要包含 #include 標頭檔案。

建構函式

thread();//預設建構函式,沒有執行的例項物件
thread (fun,_1,_2,...)//初始化建構函式,有執行的例項物件,可以傳遞普通函式,類方法,lambda表示式
thread(const thread&);//複製建構函式,已經刪除該構造方法
thread(thread &&
x);//move建構函式 ,只能給已經分配了執行例項物件的執行緒構造,且構造後原來的執行緒物件就不能使用。

棧上:

 std::thread t1(fun);
 std::thread th[3]{thread(fun), thread(fun), thread(fun)}; 

堆上:

	std::thread * t1(new std::thread(fun));
	std::thread *pth(new std::thread[3]{ std::thread(fun), std::thread(fun), std::thread(fun) });

賦值

只支援move賦值,也是隻能是分配了例項物件的執行緒賦值,且賦值後,原來的執行緒物件不能使用

	std::thread t1();
	std::thread t2(fun);
	std::thread t3 = std::move(t2);
	std::thread t3 = std::move(t1);//error

成員函式

join:
主執行緒阻塞等待子執行緒完成後釋放子執行緒資源,再繼續進行,如果不加join,主執行緒不等待,會報錯。

	std::thread t2(mythread);
	t2.join();

joinable:
檢查執行緒是否可被 join,是否是活躍的執行緒物件

if (t1.joinable())    t1.join();

get_id:
獲取執行緒 ID,返回一個型別為 std::thread::id 的物件

std::thread::id t1_id = t1.get_id();

detach:
將當前執行緒物件所代表的執行例項與該執行緒物件分離,使得執行緒的執行可以單獨進行,。一旦執行緒執行完畢,它所分配的資源將會被釋放。
swap:
交換兩個執行緒物件所代表的底層控制代碼,即id.

std::swap(t1, t2);
t1.swap(t2);

hardware_concurrency:
獲得電腦cpu核心數量

	auto a=std::thread::hardware_concurrency();

std::this_thread 名稱空間

get_id: 獲取執行緒 ID。
yield: 暫停當前的執行緒執行。

do {
		std::this_thread::yield();
	} while (//do something);

sleep_until: 執行緒sleep到某個時間點重新喚醒。sleep1秒

	auto a = std::chrono::high_resolution_clock::now() + std::chrono::microseconds(1000);
	std::this_thread::sleep_until(a);

sleep_for: 執行緒休眠某個指定的時間段,該執行緒才被重新喚醒。sleep1秒

std::this_thread::sleep_for(std::chrono::microseconds(1000));

最後

瞭解了基本的執行緒使用,執行緒的同步可以使用join實現,甚至std::this_thread的sleep也能粗略的同步。後面是執行緒的互斥量,訊號量來實現執行緒資料的安全訪問。