文章目录

  • 1. 互斥量简介
  • 2. thread库七种互斥量
  • 3. 示例代码1
  • 4. 示例代码2
  • 5. 示例代码3

C++ Boost库:简介和第一个示例程序
C++ Boost库:数值转换 lexical_cast
C++ Boost库:字符串格式化 format
C++ Boost库:字符串string_algo
C++ Boost库:字符串算法string_algo
C++ Boost库:类型推导BOOST_AUTO/BOOST_TYPEOF
C++ Boost库:分词处理库 tokenizer
C++ Boost库:windows下编译Boost库
C++ Boost库:日期时间库 date_time
C++ Boost库:智能指针scoped_ptr
C++ Boost库:数组智能指针 scoped_array
C++ Boost库:共享所有权的智能指针 shared_ptr
C++ Boost库:工厂函数 make_shared
C++ Boost库:共享有权的数组智能指针shared_array
C++ Boost库:弱引用智能指针 weak_ptr
C++ Boost库:禁止拷贝 nocopyable
C++ Boost库:计时器 timer
C++ Boost库:普通数组array
C++ Boost库:散列容器 unordered_set、unordered_multiset
C++ Boost库:散列容器 unordered_map、unordered_multimap
C++ Boost库:双向映射容器 bimap
C++ Boost库:环形缓冲区 circular_buffer
C++ Boost库:动态多维数组 multi_array
C++ Boost库:使用property_tree解析XML和JSON
C++ Boost库:简化循环 BOOST_FOREACH
C++ Boost库:随机数库 Random
C++ Boost库:引用库 ref
C++ Boost库:绑定库 bind
C++ Boost库:线程库 thread 跨平台多线程
C++ Boost库:互斥量 mutex

1. 互斥量简介

互斥量(Mutex)是 一种线程同步手段,可以在多线程编程中防止多个线程同时操作共享资源(或称临界区),一旦一个线程锁住互斥量,捷他线程必须等它解锁之后才能进行访问。

WindowsLinux下创建互斥量的函数是有所不同的:

平台 Windows Linux
创建 CreateMutex() pthread_mutex_init()
销毁 CloseHandle() pthread_mutex_destroy()
加锁 WaitForSingleObject() pthread_mutex_lock()
解锁 ReleaseMutex() pthread_mutex_unlock()

2. thread库七种互斥量

thread库有五种互斥量类型,分别是:

  • mutex:或 try_mutex独占式的互斥量;最简单最常用的一种互斥量类型
  • timed_mutex:它是独占式互斥量,但是它提供超时锁定功能;
  • recursive_mutexrecursive_try_mutex:递归式互斥量,可多次锁定,需要多次解锁;
  • recursive_time_mutex:与recursive_mutex一致,提供超时;
  • shared_mutexmultiple-reader/single-writer型共享互斥量(读写锁)

3. 示例代码1

#include<boost/thread.hpp>
using  namespace  boost; //名字空间#include<iostream>
using namespace std;#pragma comment(lib ,"libboost_thread-vc100-mt-gd-x32-1_67.lib")//多个售票窗口同时卖票,总票数100张
int  tickets = 100;//定义互斥量mutex
mutex   m;void  SellA()
{while (true){//this_thread::sleep(posix_time::milliseconds(10));m.lock();//保护共享资源同一时刻只有一个线程访问if (tickets > 0){printf("A窗口卖出第%d张票!\n", tickets);//A,B同时进入--tickets; } m.unlock();if(tickets<=0) break; }
}void  SellB()
{while (true){//this_thread::sleep(posix_time::milliseconds(10));m.lock();if (tickets > 0){printf("B窗口卖出第%d张票!\n", tickets);--tickets;}m.unlock();if (tickets <= 0) break;}
}int main()
{ thread  ta(SellA);//A线程立即执行thread  tb(SellB);//B线程立即执行ta.join();//等待线程结束tb.join();//等待线程结束cout << "票卖光了!" << endl;getchar();return 0;
}

运行结果:

4. 示例代码2

#include<boost/thread.hpp>
using  namespace  boost; //名字空间#include<iostream>
using namespace std;#pragma comment(lib ,"libboost_thread-vc100-mt-gd-x32-1_67.lib")
//try_mutex  m;//try_mutex 等价于 typedef mutex try_mutex;//超时返回的mutex
timed_mutex  tmu;void  ThreadFun1()
{tmu.lock();printf("ThreadFun1先锁住8秒!\n" );this_thread::sleep(posix_time::seconds(8)); tmu.unlock();printf("ThreadFun1解锁!\n");
}void  ThreadFun2()
{//尝试锁住mutex,如果有其他线程锁住,最多阻塞3秒然后返回0 this_thread::sleep(posix_time::seconds(1));printf("ThreadFun2尝试加锁!\n");bool  bLock = tmu.try_lock_for(chrono::seconds(3));//第3秒时,线程1仍然锁着,所以线程2无法加锁,返回0//bool  bLock=tmu.try_lock_for(chrono::seconds(10)); //第10秒时,线程1已经解锁,所以线程2可以加锁,返回1cout << "ThreadFun2加锁是否成功:" << bLock << endl;tmu.unlock();
}int main()
{ thread  t1(ThreadFun1);thread  t2(ThreadFun2);t1.join();t2.join();cout << "线程执行结束!" << endl;getchar();return 0;
}

运行结果:

5. 示例代码3

#include<boost/thread.hpp>
using  namespace  boost; //名字空间#include<iostream>
using namespace std;#pragma comment(lib ,"libboost_thread-vc100-mt-gd-x32-1_67.lib")//mutex  m;//普通mutex加锁两次会死锁recursive_mutex  m;//递归mutex, 可以多次加锁,防止死锁,必须相应多次解锁void  ThreadFun1()
{m.lock();//第一次加锁cout << "ThreadFun1第一次加锁!" << endl;m.lock();//第二次加锁cout << "ThreadFun1第二次加锁!" << endl;m.unlock();cout << "ThreadFun1第一次解锁!" << endl;this_thread::sleep(posix_time::seconds(8));//睡眠8秒后第二次解锁m.unlock();cout << "ThreadFun1第二次解锁!" << endl;
}void  ThreadFun2()
{this_thread::sleep(posix_time::seconds(1));//保证在线程1后面执行bool  b=m.try_lock();//不阻塞加锁 ,加锁成功返回1,加锁失败返回0cout << "ThreadFun2加锁是否成功:" << b << endl;m.unlock();
}int main()
{  //同时执行thread  t1(ThreadFun1); thread  t2(ThreadFun2);t1.join();t2.join();cout << "线程运行结束!" << endl;getchar();return 0;
}

运行结果:

C++ Boost库:互斥量 mutex相关推荐

  1. [一个经典的多线程同步问题]解决方案三:互斥量Mutex

    本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...

  2. mysql 互斥_MySql中互斥量mutex的实现

    数据库中的Mutex量指的是一种用于保护一些临界资源的使用的信号量.当有线程需要使用这些临界资源时,会请求获得mutex量,请求成功的线程进入临界区,而请求失败的线程只能等待它释放这个mutex.互斥 ...

  3. 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  4. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  5. 经典线程同步 互斥量Mutex的使用分析

    互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问. 互斥量对象包含一个使用计数.线程ID以及一个递归计数. 互斥量与关键段的行为完全相同.但是,互斥量是内核对象,而关键段是用户模式下的 ...

  6. 互斥量(mutex)与事件(event)的使用

    互斥量(Mutex) CreateMutex :创建一个互斥量 HANDLE   CreateMutex(             LPSECURITY_ATTRIBUTES   lpMutexAtt ...

  7. windows 多线程(五) 互斥量(Mutex)

    参考:http://blog.csdn.net/morewindows/article/details/7470936 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行 ...

  8. C#线程同步(3)- 互斥量 Mutex

    什么是Mutex "mutex"是术语"互相排斥(mutually exclusive)"的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似, ...

  9. linux mutex 数量上限,互斥量mutex

    Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁. 资源还是共享的,线程间也还是竞争的,但通过"锁"就将 ...

  10. C# 多线程四:互斥量Mutex的简单理解与运用

    目录 一. 特点: 1.非静态类继承 2.可以跨进程 二.构造函数 1.Mutex() 2.Mutex(Boolean) 2. Mutex(Boolean, String) 3.Mutex(Boole ...

最新文章

  1. PAT(甲级)2019年秋季考试 7-3 Postfix Expression
  2. CosmoMC第一次测试
  3. 贾跃亭融资计划书曝光:看他如何靠两份PPT融资150亿
  4. SpringBoot - 优雅的实现【自定义参数校验】高级进阶
  5. Linux下使用g++编译C++程序——Compiling Cpp
  6. 嵌入式基础认识1:存储器(如RAM、ROM和FLASH)
  7. es6 Atomics对象
  8. 投影幕布尺寸计算器_投影距离计算器
  9. 蓝桥杯算法训练超全习题题解——ALGO-3.K好数**
  10. 【新书推荐】大唐的裂变(套装共5册)(王澄明等著)
  11. CAN总线的学习总结
  12. 接龙管家-Python自动打卡
  13. chrome是什么?
  14. HashTab-查看哈希值小工具,一键插件文件md5值
  15. 穷人跟懒人 富人跟勤快人
  16. 【Dubbo实战】基础学习篇(一)
  17. Lwip从入门到放弃之(一)---基础网络知识扫盲
  18. 手机玩游戏卡顿怎么办。
  19. WPS本地表格数据粘贴到钉钉在线表格
  20. 从流量分析看20几个购物网,很好很强大

热门文章

  1. [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
  2. 财务系统服务器计入什么科目,系统服务费入什么科目
  3. 浪曦视频《J2EE测试使用指南Junit3.8详解》学习总结
  4. 凸多边形、凹多边形、凸包算法
  5. Git学习笔记:版本回滚
  6. 2020苏州大学计算机考研经验总结博
  7. 小票打印机 linux 驱动下载,POS58小票机驱动下载
  8. Java三大主流框架
  9. 三星note9刷Android9,三星Note9官方韩版安卓9固件rom刷机包 N960NKSU2CSD3
  10. Arduino 寻找IIC设备地址的代码