C++11多线程条件变量的使用

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <cassert>

// 参考: http://www.cnblogs.com/haippy/p/3284540.html

namespace thread_cv {

bool g_ready = false;
std::mutex g_mutex;
std::condition_variable g_cv;

// 1.条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:
// 一个线程等待某个条件为真,而将自己挂起;另一个线程使的条件成立,并通知等待的线程继续。为了防止竞争,
// 条件变量的使用总是和一个互斥锁结合在一起。

// 2.条件变量(condition variable)是一种特殊的同步变量,它是与一个互斥量(monitor)关联的线程队列,
// 条件变量都与一个断言(assertion) P关联,因为其中的线程队列中有一个线程在等待这个断言P为真。
// 当一个线程处于等待条件变量(condition variable)时,该线程不再占用互斥量(monitor),让其他线程能够进入
// 互斥区去改变条件状态。
static void PrintId(int i) {
  std::unique_lock<std::mutex> lock(g_mutex);

  while (!g_ready) {
    // 该线程出于wait阻塞等待时,也就是其他线程获得了互斥锁,所以此线程等待其他线程释放锁之后notify它之后,
    // 此线程才能获得锁。
    g_cv.wait(lock);
  }

  std::cout << i << std::endl;
}

static void Test1() {
  const int kThreadCount = 10;

  std::thread thread[kThreadCount];
  for (int i = 0; i < kThreadCount; ++i) {
    thread[i] = std::thread(PrintId, i);
  }

  std::cout << "All threads prepare to print id:" << std::endl;

  {
    std::unique_lock<std::mutex> lock(g_mutex);
    g_ready = true;
    g_cv.notify_all();
  }

  for (int i = 0; i < kThreadCount; ++i) {
    thread[i].join();
  }
}

//-------------------------------------------------------------------

std::string g_value;

static void ReadValue() {
  std::cin >> g_value;
  g_cv.notify_one();
}

static void Test2() {
  std::thread thread(ReadValue);

  std::unique_lock<std::mutex> lock(g_mutex);
  // 3.wait_for可以指定一个时间段,在当前线程收到通知或者指定的时间 rel_time 超时之前,该线程都会处于阻塞状态。
  // 如果超时返回std::cv_status::timeout。如果收到了其他线程的通知,返回std::cv_status::no_timeout。
  while (g_cv.wait_for(lock, std::chrono::seconds(1)) == std::cv_status::timeout) {
    std::cout << "." << std::endl;
  }

  thread.join();

  std::cout << g_value << std::endl;
}

}  // namespace thread_cv

int main3() {
  using namespace thread_cv;

  //Test1();
  Test2();

  return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值