Boost中的锁

原来以为自己很喜欢多线程的程序,可是当真正调试起来却发现很麻烦,你不得不考虑锁的力度,现在我的问题是本该对数据加锁,C++的容器默认是非线程安全的,一个线程读,另一个线程写,迭代器很容易就会指到错误的范围地址,可是程序写到这个程度了也要快毕业答辩了,怎么可能把全部的东西都推到重写啊,想想也只有对代码进行加锁了,虽然效率会低很多吧,Boost 库中有,一般的锁,读写锁,还有一种可重入的递归锁。

我试了下对代码进行加锁,虽然效率不高,但是可以解决目前的问题吧,最好是多数据加锁。

#include "boost/thread/thread.hpp"
#include "boost/bind.hpp"
#include "boost/thread/mutex.hpp"

#include <queue>
#include <list>
#include <iostream>
using namespace std;
boost::shared_mutex  read_write_mutex;
boost::mutex lock;
queue<int> data;
class HelloWorld
{
public:
	bool start;
	void prinf()
	{
		start = 1;
		
		while (start)
		{
			lock.lock();
			while (!data.empty())
			{
				int i = data.front();
				std::cout << "the number is " << " " << i << std::endl;
				data.pop();
			}
			lock.unlock();
		}
	}

	void hello(const std::string& str)
	{
		std::cout << str << std::endl;
		prinf();
	}

	void hello2(const std::string& str)
	{
		std::cout << str << std::endl;
		lock.lock();
		for (int i = 0; i < 100; i++)
			data.push(i);
		lock.unlock();
	}
};

int main()
{
	HelloWorld obj;
	boost::thread thrd(boost::bind(&HelloWorld::hello2, &obj, "Hello World, I'm a thread!"));
	boost::thread thrd2(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread hello2!"));
	thrd.join();
	thrd2.join();
	return 0;
}


觉得自己定义的数据结构该是这样的。


template<class T>
class  Mydata
{
public:
	T getdata(){}
	void setdata();
	void insert(T);
	void del(int index);
	void clear();
	T front();
	void pop();
	void push(T)
	{
		lock.lock();
		data.push(T);
		lock.unlock();
	}

private:
	boost::mutex lock;
	queue<T> data;
};


一下是摘录网上的资源


   boost锁的概述

boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁。

 

     mutex对象类

mutex类主要有两种:boost::mutexboost::shared_mutex,其中mutexlockunlock方法,shared_mutex除了提供lockunlock方法外,还有shared_lockshared_unlock方法。因此,boost::mutex为独占互斥类,boost::shared_mutex为共享互斥类。

 

     lock模板类

boost::unique_lock<T>boost::shared_lock<T>,其中unique_lock为独占锁,shared_lock为共享锁。unique_lock<T>中的T可以为mutex类中的任意一种,如果为shared_mutex,那么boost:: unique_lock<boost::shared_mutex>类的对象构造函数构造时,会自动调用shared_mutexshared_lock方法,析构函数里,会自动调用shared_mutexshared_unlock方法。如果是boost:: unique_lock<boost::mutex>,则分别自动调用lockunlock方法。

boost::shared_lock<T>中的T只能是shared_mutex类。

 

     读写锁的实现

typedef boost::shared_lock<boost::shared_mutex> readLock;

typedef boost:: unique_lock<boost::shared_mutex> writeLock;

 

boost::shared_mutex  rwmutex;

 

void readOnly( )

{

        readLock  rdlock( rwmutex );

        /// do something

}

 

void writeOnly( )

{

        writeLock  wtlock( rwmutex );

        /// do something

}

对同一个rwmutex,线程可以同时有多个readLock,这些readLock会阻塞任意一个企图获得writeLock的线程,直到所有的readLock对象都析构。如果writeLock首先获得了rwmutex,那么它会阻塞任意一个企图在rwmutex上获得readLock或者writeLock的线程。

 

★互斥锁的实现

typedef boost:: unique_lock<boost::mutex> exclusiveLock;

 

▼递归式的互斥量

boost::recursive_mutex提供一个递归式的互斥量。对于一个实例最多允许一个线程拥有其锁定,如果一个线程已经锁定一个boost::recursive_mutex实例,那么这个线程可以多次锁定这个实例。

 boost::mutex::scoped_lock

boost::mutex io_mutex;

void foo( )

{

        {

                boost::mutex::scoped_lock lock( io_mutex );         /// 锁定

        } /// 解锁

}

 

■其它

boost::mutex

boost::timed_mutex

boost::shared_mutex

boost::recursive_mutex

boost::recursive_timed_mutex

 

boost::lock_guard

boost::shared_lock

boost::upgrade_lock

boost::unique_lock

boost::upgrade_to_unique_lock

 



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boost库提供了多种类型的,用于实现线程间的同步和互斥操作。下面是一些常用的 Boost 的详细解释: 1. boost::mutex: - boost::mutex 是 Boost最基本的互斥。 - 它提供了两个主要的成员函数:lock() 和 unlock(),用于手动控制的加和解。 - boost::mutex 是非递归,同一个线程多次对其加会导致死。 2. boost::recursive_mutex: - boost::recursive_mutex 是可重入,也称为递归。 - 它允许同一个线程多次对其加,避免了死的问题。 - 和 boost::mutex 相比,boost::recursive_mutex 在使用上更加灵活,但也更加消耗资源。 3. boost::timed_mutex: - boost::timed_mutex 是一种带超时功能的互斥。 - 它提供了 try_lock_for() 和 try_lock_until() 成员函数,用于尝试加一段时间或者在指定的时间点之前加。 - 可以用来避免长时间等待导致的性能问题。 4. boost::shared_mutex: - boost::shared_mutex 是一种读写,也称为共享。 - 它允许多个线程同时获得读取权限,但只允许一个线程获得写入权限。 - 这种适用于读多写少的场景,可以提高并发性能。 5. boost::upgrade_mutex: - boost::upgrade_mutex 是一种升级,也称为可升级的读写。 - 它允许多个线程同时获得读取权限,但只允许一个线程获得写入权限。 - 不同于 boost::shared_mutex,boost::upgrade_mutex 还提供了 upgrade() 和 downgrade() 成员函数,可以在读取和写入权限之间进行转换,提供了更加灵活的操作方式。 这些是 Boost常用的类型,根据实际需求选择适合的可以提高多线程程序的性能和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值