C 11用兩個執行緒輪流列印整數的實現方法

2022-09-25 06:54:09 字數 1196 閱讀 3018

使用c++11標準的的執行緒語法,用兩個執行緒輪流列印整數,乙個執行緒列印奇數,乙個執行緒列印偶數。可以練習執行緒的基本操作、執行緒鎖和條件變數等技術。完整**如下。**後面附有主要語句的講解。

#include

#include

#include

#include

std::mutex data_mutex;

std::condition_variable data_var;

bool label = false;

void printodd()

); std::cout<< std::this_thread::get_id() << ": " << odd <<:endl label="false;" data_var.notify_one void printeven std::unique_lock> ulock(data_mutex) ;

for(int even = 0; even < 100; even += 2 )

);}}

int main()

{ std::thread t1(printeven);

bjryozstd::thread t2(printodd);

t1.join();

t2.join();

std::cout<

程式中使用bjryozstd::unique_lock<:mutex> ulock(data_mutex)來管理互斥量,

這是乙個raii的資源管理方式,在ulock析構的時候,會自動釋放data_mutex。

std::condition_variable提供了兩種 wait() 函式。當前執行緒呼叫 wait() 後將被阻塞,此時當前執行緒應該獲得了鎖(也就是互斥量data_mutex),直到另外某個執行緒呼叫 notify_* 喚醒了當前執行緒。

**程被阻塞時,該函式會自動呼叫 data_mutex.unlock() 釋放鎖,使得其他被阻塞在鎖競爭上的執行緒得以繼續執行。另外,一旦當前執行緒獲得通知(notified,通常是另外某個執行緒呼叫 notify_* 喚醒了當前執行緒),wait()函式也是自動呼叫data_mutex.lock(),使得data_mutex的狀態和 wait 函式被呼叫時相同。

在第二種情況下(即設定了前提條件),只有當前提條件為false時呼叫 wait() 才會阻塞當前執行緒,並且在收到其他執行緒的通知後只有當前提條件為true 時才會被解除阻塞。

總結

用C 11的多執行緒讀檔案

曾經寫了一篇部落格做一些大資料的處理,但是其中在讀取乙個大檔案的時候,並沒有採取並行處理的方式。那麼,乙個大檔案,為了能夠批量處理,現在由多個執行緒來同時讀它,各自讀取一塊 所讀內容互不相同 這麼做會有問題嗎?答 如果只有讀執行緒,那麼沒有問題。因為,不同的執行緒可以建立自己的檔案描述符表項,再分別...

用C 11的std async代替執行緒的建立

c 11中增加了執行緒,使得我們可以非常方便的建立執行緒,它的基本用法是這樣的 void f int n std thread t f,n 1 t.join std future是乙個非常有用也很有意思的東西,簡單說std future提供了一種訪問非同步操作結果的機制。從字面意思來理解,它表示未來...

用C 11的std async代替執行緒的建立

c 11中增加了執行緒,使得我們可以非常方便的建立執行緒,它的基本用法是這樣的 void f int n std thread t f,n 1 t.join std future是乙個非常有用也很有意思的東西,簡單說std future提供了一種訪問非同步操作結果的機制。從字面意思來理解,它表示未來...