1. 程式人生 > 程式設計 >C++11用兩個執行緒輪流列印整數的實現方法

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

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

#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>
 
std::mutex data_mutex;
std::condition_variable data_var;
bool label = false;
 
void printodd()
{
  std::unique_lock<std::mutex> ulock(data_mutex) ;
  for(int odd = 1; odd <= 100; odd += 2 )
  {
    data_var.wait(ulock,[]{return label;});
    std::cout<< std::this_thread::get_id() << ": " << odd <<std::endl;
    label = false;
    data_var.notify_one();
  }
}
 
void printeven()
{
  std::unique_lock<std::mutex> ulock(data_mutex) ;
  for(int even = 0; even < 100; even += 2 )
  {
    std::cout<< std::this_thread::get_id() << ": " << even <<std::endl;
    data_var.notify_one();
    label = true;
    data_var.wait(ulock,[]{return !label;});
  }
}
 
int main()
{
  std::thread t1(printeven);
  std::thread t2(printodd);
  t1.join();
  t2.join();
  std::cout<<"end!"<<std::endl;
  return 0;
}

程式中使用std::unique_lock<std::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執行緒列印整數內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!