C++ Boost库:互斥量 mutex
文章目录
- 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
)是 一种线程同步手段,可以在多线程编程中防止多个线程同时操作共享资源(或称临界区),一旦一个线程锁住互斥量,捷他线程必须等它解锁之后才能进行访问。
Windows
和 Linux
下创建互斥量的函数是有所不同的:
平台 | 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_mutex
或recursive_try_mutex
:递归式互斥量,可多次锁定,需要多次解锁;recursive_time_mutex
:与recursive_mutex
一致,提供超时;shared_mutex
:multiple-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相关推荐
- [一个经典的多线程同步问题]解决方案三:互斥量Mutex
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...
- mysql 互斥_MySql中互斥量mutex的实现
数据库中的Mutex量指的是一种用于保护一些临界资源的使用的信号量.当有线程需要使用这些临界资源时,会请求获得mutex量,请求成功的线程进入临界区,而请求失败的线程只能等待它释放这个mutex.互斥 ...
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...
- 经典线程同步 互斥量Mutex的使用分析
互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问. 互斥量对象包含一个使用计数.线程ID以及一个递归计数. 互斥量与关键段的行为完全相同.但是,互斥量是内核对象,而关键段是用户模式下的 ...
- 互斥量(mutex)与事件(event)的使用
互斥量(Mutex) CreateMutex :创建一个互斥量 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAtt ...
- windows 多线程(五) 互斥量(Mutex)
参考:http://blog.csdn.net/morewindows/article/details/7470936 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行 ...
- C#线程同步(3)- 互斥量 Mutex
什么是Mutex "mutex"是术语"互相排斥(mutually exclusive)"的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似, ...
- linux mutex 数量上限,互斥量mutex
Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁. 资源还是共享的,线程间也还是竞争的,但通过"锁"就将 ...
- C# 多线程四:互斥量Mutex的简单理解与运用
目录 一. 特点: 1.非静态类继承 2.可以跨进程 二.构造函数 1.Mutex() 2.Mutex(Boolean) 2. Mutex(Boolean, String) 3.Mutex(Boole ...
最新文章
- PAT(甲级)2019年秋季考试 7-3 Postfix Expression
- CosmoMC第一次测试
- 贾跃亭融资计划书曝光:看他如何靠两份PPT融资150亿
- SpringBoot - 优雅的实现【自定义参数校验】高级进阶
- Linux下使用g++编译C++程序——Compiling Cpp
- 嵌入式基础认识1:存储器(如RAM、ROM和FLASH)
- es6 Atomics对象
- 投影幕布尺寸计算器_投影距离计算器
- 蓝桥杯算法训练超全习题题解——ALGO-3.K好数**
- 【新书推荐】大唐的裂变(套装共5册)(王澄明等著)
- CAN总线的学习总结
- 接龙管家-Python自动打卡
- chrome是什么?
- HashTab-查看哈希值小工具,一键插件文件md5值
- 穷人跟懒人 富人跟勤快人
- 【Dubbo实战】基础学习篇(一)
- Lwip从入门到放弃之(一)---基础网络知识扫盲
- 手机玩游戏卡顿怎么办。
- WPS本地表格数据粘贴到钉钉在线表格
- 从流量分析看20几个购物网,很好很强大