我是靠谱客的博主 紧张烤鸡,最近开发中收集的这篇文章主要介绍C++ Boost库:互斥量 mutex1. 互斥量简介2. thread库七种互斥量3. 示例代码14. 示例代码25. 示例代码3,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 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下创建互斥量的函数是有所不同的:

平台WindowsLinux
创建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;
}

运行结果:

image-20210504193654421

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;
}

运行结果:

image-20210504193946457

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;
}

运行结果:

image-20210504194055306

最后

以上就是紧张烤鸡为你收集整理的C++ Boost库:互斥量 mutex1. 互斥量简介2. thread库七种互斥量3. 示例代码14. 示例代码25. 示例代码3的全部内容,希望文章能够帮你解决C++ Boost库:互斥量 mutex1. 互斥量简介2. thread库七种互斥量3. 示例代码14. 示例代码25. 示例代码3所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部