C 併發操作 多執行緒

2022-07-22 19:00:12 字數 1948 閱讀 8371

c++11 新標準中引入了幾個標頭檔案來支援多執行緒程式設計:

< thread > :包含std::thread類以及std::this_thread命名空間。管理執行緒的函式和類在 中宣告.

< atomic > :包含std::atomic和std::atomic_flag類,以及一套c風格的原子型別和與c相容的原子操作的函式。

< mutex > :包含了與互斥量相關的類以及其他型別和函式

< future > :包含兩個provider類(std::promise和std::package_task)和兩個future類(std::future和std::shared_future)以及相關的型別和函式。

< condition_variable > :包含與條件變數相關的類,包括std::condition_variable和std::condition_variable_any。

在c++11中可以簡單地使用std:thread類來建立執行緒,構造thread物件時傳入乙個可呼叫物件作為引數(如果帶參,則將引數也同時傳入),可呼叫物件包括函式、函式指標、lambda表示式、bind建立的物件或過載了函式呼叫運算子的物件,例如:

/*無參*/

void thread01()

/*含參*/

void thread02(int i,int j)

...int main()

若採用std:thread的預設建構函式來構造物件,則該thread不關聯任何執行緒,可以利用joinable()來檢視乙個thread物件是否關聯某個執行緒

int main()

}void thread02()

}int main()

多次執行程式結果:

可以看到每次執行的結果都與預期的結果不一樣,資料未加鎖則會引起資料衝突。下面是加鎖狀態:

void thread01()

}void thread02()

}//其他與上面的例子相同

程式執行結果:

這次程式執行的結果是正確的,可以看出資料加鎖的重要性。不過由於加鎖會導致阻塞,因此保護資料多了會影響程式執行的效率。

try_lock()會試圖去lock mutex物件,但是不會造成阻塞,通常有以下幾種情況:

如果mutex沒有被任何執行緒lock,則呼叫執行緒會lock

如果mutex被其他執行緒lock,則該函式會失敗,返回false,但是不會造成阻塞。

如果mutex被與呼叫該函式的執行緒相同的執行緒lock,則會產生乙個死鎖,因為mutex不支援遞迴,一般情況下會崩潰。

std::lock_guard用於管理mutex,很顯然對於mutex的lock()和unlock()要成對呼叫,如果lock()之後忘記unlock()會出現死鎖或其他很嚴重的錯誤,而有時程式會有很多出口,例如breakcontinuereturn,有時還會有異常丟擲,在這些出口前都加上unlock()很麻煩。

std::lock_guard是mutex的封裝器,建立lock_guard物件時,它會試圖接收給定mutex的所有權。當執行緒離開建立lock_guard物件所在的作用域時,lock_guard物件被自動析構並釋放mutex,我們可以將上述thread01()改為:

void thread01()

}

std::unique_lock 與std::lock_guard都能實現自動加鎖與解鎖功能,但是std::unique_lock要比std::lock_guard更靈活,但是更靈活的代價是占用空間相對更大一點且相對更慢一點。此處不展開說明。

多執行緒同步操作 多執行緒技術三

執行緒的同步在多執行緒中是十分重要的,保證程式中多個執行緒有序執行不衝突,並且能夠達到程式設計師的要求。同步的實現方面有兩種,分別是synchronized,wait與notify wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的lock。sleep 使乙個正在執行的執行緒處於睡眠狀態,是...

多執行緒併發操作

閒來無事,就搞了搞多執行緒的東西,今天就將要寫的部分東西貼到下面,僅供菜鳥學習。不多說了,直接貼 檢視 public class threadpool util extends threadgroup 向工作佇列中加入乙個新任務,由工作執行緒去執行該任務 public synchronized vo...

多執行緒併發

多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...