概述
文章目录
- 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可以加锁,返回1
cout << "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,加锁失败返回0
cout << "ThreadFun2加锁是否成功:" << b << endl;
m.unlock();
}
int main()
{
//同时执行
thread t1(ThreadFun1);
thread t2(ThreadFun2);
t1.join();
t2.join();
cout << "线程运行结束!" << endl;
getchar();
return 0;
}
运行结果:
最后
以上就是紧张烤鸡为你收集整理的C++ Boost库:互斥量 mutex1. 互斥量简介2. thread库七种互斥量3. 示例代码14. 示例代码25. 示例代码3的全部内容,希望文章能够帮你解决C++ Boost库:互斥量 mutex1. 互斥量简介2. thread库七种互斥量3. 示例代码14. 示例代码25. 示例代码3所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复