zoukankan      html  css  js  c++  java
  • 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. " << '
    ';
      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状态的。

  • 相关阅读:
    PeerJS
    OpenEMM 2013 发布,电子邮件营销软件
    feh 2.9 发布,图像查看器
    PyPyODBC 0.9.2发布 纯Python实现的pyodbc替代库
    MariaDB 5.5.29, 5.3.12, 5.2.14, 5.1.67
    CouchDB 1.3.0的新特性以及算法的强化
    Boost 1.53.0 发布,可移植的C++标准库
    ActiveMQ 5.8.0 发布,JMS 消息服务器
    MySQL 5.5.30 发布
    CloverETL Designer 3.3.1 发布
  • 原文地址:https://www.cnblogs.com/bugutian/p/13898094.html
Copyright © 2011-2022 走看看