C 11 多執行緒

2021-09-25 08:35:31 字數 3558 閱讀 2621

參考《深入應用c++11》

#includeusing namespace std;

void func()

int main()

可以使用thread t(f(), args)建立執行緒,引數為執行緒函式,後面可以帶任意個需要傳入執行緒函式的引數

join方法可以使主線程阻塞住,直到t執行緒函式執行完,join方法不能獲取執行緒函式返回值

如果不希望主線程阻塞,而是讓t執行緒在後台執行,可以使用detach方法

int main()

(1)獲取當前資訊

thread t(func);

cout << t.get_id() << endl; //獲取當前執行緒id

cout << thread::hardware_concurrency() << endl; //獲取cpu核數,失敗返回0

(2)執行緒休眠

#includevoid f()

//執行緒休眠3秒後列印time_out

int main()

互斥量是一種執行緒同步手段,用來保護多執行緒同時訪問的共享資料

#includeusing namespace std;

mutex g_lock; //定義互斥量

g_lock.lock(); //鎖定互斥量

g_lock.unlock(); //解除對互斥量的占用

g_lock.try_lock(); //嘗試鎖定互斥量,成功返回true,失敗返回false,它是非阻塞的

使用lock_guard可以簡化lock/unlock寫法,同時也更安全,因為lock_guard在構造時自動鎖定互斥量,在退出作用域時自動解鎖,避免了忘記unlock,因此應盡量使用lock_guard

std::lock_guardlocker(g_lock);
使用unique_lock也可以實現lock_guard的功能,但是更加靈活,具體參見c++多執行緒:條件變數、unique_lock

乙個執行緒多次獲取同乙個互斥量時會發生死鎖

mutex g_lock;

void child_fun(int x)

void fun(int x)

int main()

遞迴互斥量允許同一執行緒多次獲得該互斥鎖,可以用來解決同一執行緒需要多次獲取互斥量的問題

recursive_mutex g_lock;

void child_fun(int x)

void fun(int x)

int main()

帶超時的互斥量在獲取鎖時增加了超時等待功能,如果超時沒有獲取到可以做其他事情

可以用try_lock_for和try_lock_until方法設定超時時間,失敗返回0

chrono::milliseconds timeout(100);

if(mutex.try_lock_for(timeout))

cout << "success" << endl;//100毫秒內成功鎖定互斥量

條件變數是另一種用於等待的同步機制,能阻塞乙個或多個執行緒,直到收到另乙個執行緒發出的通知或超時

c++11提供兩種條件變數

condition_varible //配合unique_lock進行wait操作

condition_varible_any //和任意帶有lock,unlock語義的mutex搭配使用,更靈活,但效率低於condition_varible

條件變臉一般和互斥量一起使用,具體例項可見同步阻塞佇列

使用互斥量實現計數器

#includeusing namespace std;

class counter

void counter::decr()

int counter::get()

private:

int value;

mutex lock;

};

使用原子變數就不需要使用互斥量來保護變數了

#includeusing namespace std;

class atomiccounter

void atomiccounter::decr()

int atomiccounter::get()

private:

atomicvalue;

};

為了保證多執行緒環境中僅被呼叫一次,可以使用call_once,需要使用std::once_flag作為call_once的入參

once_flag flag;

void fun());}

int main()

//into fun只會列印一次

c++提供了非同步操作的類,future類可以用來獲取執行緒函式的返回值

可以通過查詢future的狀態獲取非同步操作的結果,future_status有以下三種狀態

deferred //非同步操作還沒開始

ready //非同步操作已經完成

timeout //非同步操作超時

獲取future結果有三種方式

get() //等待非同步操作結束並返回結果

wait() //等待非同步操作完成,沒有返回值

wait_for() //超時等待返回結果

非同步操作函式async可以直接建立非同步的task,非同步返回的結果也儲存在future中

async(std::launch::async | std::launch::deferred, f, args)

//第乙個引數是執行緒的建立策略,launch::async是立即建立,launch::deferred是延遲建立,在呼叫get或wait時建立

基本用法

#include int main()

); cout << f1.get() << endl;

futuref2 = async(launch::async, () );

f2.wait();

futurefuture = async(launch::async, () );

cout << "waiting" << endl;

auto status = future.wait_for(chrono::seconds(1));

do while (status != future_status::ready);

cout << "result is " << future.get() << endl;

return 0;

}

結果為88

waiting

time out

time out

ready

result is 8

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...