C++11多线程---互斥量mutex、锁lock、条件变量std::condition_variable

目录

一、lock_guard  lock()

1. 直接操作mutex的lock/unlock函数

2. 使用 lock_guard/unique_lock 自动加锁、解锁。类似智能指针

3、unique_lock和lock_guard区别:

二、条件变量condition_variable

1、引出条件变量

2、condition_variable


一、lock_guard<mutex>  lock()

多线程访问同一资源时,为了保证数据的一致性,必要时需要加锁mutex。

任一时刻,只能有一个线程访问该对象,加锁mutex

1. 直接操作mutex的lock/unlock函数

#include <iostream>
#include <boost>

std::mutex m_buf;


void Counter(){
   m_buf.lock();
   int i=++count;// 只有当一个线程输出完毕了,另一个线程才能输出
   m_buf.unlock();
}



int main(){
  boost::thread_group threads;// 创建进程
  for(int i=0;i<4;i++)
      threads.create_thread(&Counter);
  threads.join_all();
 return 0;
}

2. 使用 lock_guard/unique_lock 自动加锁、解锁。类似智能指针

 与上面相比只需要加锁,后面无须解锁unlock().

unique_lock<mutex> lck(m);就是创建了一个unique_lock对象lck,并将其与互斥量m绑定,同时对其上锁

#include <iostream>
#include <boost/thread/lock_guard.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

boost::mutex mutex;
int count = 0;

void Counter() {
  // lock_guard 在构造函数里加锁,在析构函数里解锁。
  boost::lock_guard<boost::mutex> lock(mutex);

  int i = ++count;
  std::cout << "count == " << i << std::endl;
}

int main() {
  boost::thread_group threads;
  for (int i = 0; i < 4; ++i) {
    threads.create_thread(&Counter);
  }

  threads.join_all();
  return 0;
}

3、unique_lock和lock_guard区别:

  1. unique_lock不需要始终拥有关联的mutex</
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值