1. 程式人生 > 實用技巧 >c++11中的condition_variable和之前的pthread_cond_timedwait的不同之處

c++11中的condition_variable和之前的pthread_cond_timedwait的不同之處

不同點:

  1. pthread_cond_timedwait需要在呼叫前自己呼叫mtx.lock();
  2. condition_variable.wait_for呼叫前unique_lock lck(mtx);加鎖的事wait_for裡面實現了。

共同點:

  1. 執行時會mtx.unlock(),檢查條件時,mtx.lock(),檢查完之後mtx.unlock;
  2. 超時或被signal後,跳出來,此時mtx處於lock的狀態;

測試c++11特性

示例程式碼:

#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <chrono>             // std::chrono::seconds
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable, std::cv_status

using namespace std;

std::condition_variable cv;
std::mutex mtx;

int value;

void read_value() {
  int cnt = 0;
  while (1) {
      this_thread::sleep_for(chrono::seconds(2));
      mtx.lock();
      cout << "sub thread." << endl;
      mtx.unlock();
      cnt++;
      if (cnt > 5) {
         cv.notify_one();
      }
  }
}

int main ()
{
  std::thread th (read_value);
  std::unique_lock<std::mutex> lck(mtx);
  //lck.lock(); 這裡放開會報死鎖
  while (cv.wait_for(lck,std::chrono::seconds(5))==std::cv_status::timeout) {
    //this_thread::sleep_for(chrono::seconds(3)); 
    std::cout << 'main thread.' << std::endl;
  }
  lck.unlock(); //這裡註釋掉之後sub thread會被一直鎖住
  std::cout << "end. " << '\n';
  this_thread::sleep_for(chrono::seconds(2000));

  th.join();

  return 0;
}
//編譯命令:g++ -g main.cpp -lpthread -o main -std=c++11

結果可以看到列印2次sub,會列印一次main, 說明wait_for在等待超時時mtx是處於unlock狀態的。