c 11新特性多執行緒操作實戰

2022-09-25 06:51:12 字數 2618 閱讀 3175

c++11多執行緒操作

執行緒thread

int main()

t3,t4建立失敗,因為thread的拷貝構造和賦值運算子過載的原型是:

thread(const thread&) = delete;

thread& operator=(const thread&) = delete;

被禁用了,但是t5, t6執行緒是建立成功的。std::move把t1轉換為右值,呼叫的是函式原型為thread& operator=(thread&& _other) noexcept和thread(thread&& _other) noexcept。

當執行緒物件t1被移動拷貝和移動賦值給t5和t6的時候,t1就失去了執行緒控制權,也就是乙個執行緒只能同時被乙個執行緒物件所控制。最直觀的是t1.joinable()返回值為false,joinable()函式後面介紹。

使用類成員函式作為執行緒引數:

class task

void task1() {}

void task2() {}

private:

};int main()

關鍵點是要建立乙個類物件,並作為第二個引數傳入thread()執行緒的建構函式中去。

管理當前執行緒的函式

yield

此函式的準確性為依賴於實現,特別是使用中的 os 排程器機制和系統狀態。例如,www.cppcns.com先進先出實時排程器( linux 的 sched_fifo )將懸掛當前執行緒並將它放到準備執行的同優先順序執行緒的佇列尾(而若無其他執行緒在同優先順序,則 yield 無效果)。

#include

#include

#include

// 建議其他執行緒執行一小段時間的「忙睡眠」

void little_sleep(std::chrono::microseconds us)

while (std::chrono::high_resolution_clock::now() < end);}

int main()

get_id

這個函式不用過多介紹了,就是用來獲取當前執行緒id的,用來標識執行緒的身份。

std::thread::id this_id = std::this_thread::get_id();

sleep_for

位於this_thread命名空間下,msvc下支援兩種時間引數。

std::this_thread::sleep_for(2s);

std::this_thread::sleep_for(std::chrono::seconds(1));

sleep_untile

引數構建起來挺麻煩的,一般場景下要求執行緒睡眠的就用sleep_for就行了

using std::chrono::system_clock;

time_t tt = system_clock::to_time_t(system_clock::now());

struct std::tm *ptm = localtime(&tt);

std::this_thread::sleep_until(system_clock::from_time_t(mktime(ptm)));

互斥mutex

對於互斥量看到乙個很好的比喻:

單位上有一台印表機(共享資料a),你要用印表機(執行緒1要運算元據a),同事老王也要用印表機(執行緒2也要運算元據a),但是印表機同一時間只能給乙個人用,此時,規定不管是誰,在用印表機之前都要向領導申請許可證(lock),用完後再向領導歸還許可證(unlock),許可證總共只有乙個,沒有許可證的人就等著在用印表機的同事用完後才能申請許可證(阻塞,執行緒1lock互斥量後其他執行緒就無法lock,只能等執行緒1unlock後,其他執行緒才能lock),那麼,這個許可證就是互斥量。互斥量保證了使用印表機這一過程不被打斷。

**示例:

mutex mtx;

int gnum = 0;

void test1()

void test2()

int main()

join()表示主線程等待子執行緒結束再繼續執行,如果我們的期望是列印迴圈自增之後的gnum的值,那t1.join()就放在t2建立之前呼叫。因為t2的建立就標誌著t2執行緒建立好然後開始執行了。

通常mutex不單獨使用,因為lock和unlock必須配套使用,如果忘記unlock很可能造成死鎖,即使unlock寫了,但是如果在執行之前程式捕獲到異常,也還是一樣會死鎖。如何解決使用mutex造成的死鎖問題呢?下面介紹unique_gard和lock_guard的時候詳細說明。

timed_mutex

提供互斥設施,實現有時限鎖定

recursive_mutex

提供能被同一執行緒遞迴鎖定的互斥設施

recursive_timed_mutex

提供能被程式設計客棧同一執行緒遞迴鎖定的互斥設施,並實現有時限鎖定

通用互斥管理

lock_guard

void test1()

}int main()

lock_guard相當於利用raii機制(「資源獲取就是初始化」)把mutex封裝了一下,在構造中lock,在析構中unlock。避免了中間過程出現異常導致的mutex不能夠正常unlock.

通用鎖演算法

單次呼叫

條件變數

future

C 11新特性 執行緒庫相關

std thread t 提供執行緒函式或者函式物件 t.join 阻塞執行緒直到執行緒函式執行完畢 t.detach 如果不希望執行緒被阻塞執行就呼叫detach 但是這會導致執行緒和執行緒物件分離。std thread建立的執行緒在出了作用域之後會被析構,如果這時候執行緒函式還沒有執行完的話就會...

C 11 多執行緒

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

c 11 多執行緒

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