共享互斥量

共享互斥变量shared_mutex允许线程获取多个共享所有权和一个专享所有权,即多个读进程一个写进程。
读锁定时使用boost::shared_lock<boost::shared_mutex>,写锁定时使用boost::unique_lock<boost::shared_mutex>。

#include <boost/thread.hpp>
#include <boost/ref.hpp>
#include <iostream>

boost::mutex io_mu;

class rw_data
{
private:
	int m_x; // 用于读写的数据
	boost::shared_mutex rw_mu; // 共享互斥量
public:
	rw_data() :m_x(0){}
	void write()
	{
		boost::unique_lock<boost::shared_mutex> lock(rw_mu); // 写锁定
		++m_x;
		boost::mutex::scoped_lock io_lock(io_mu);
		std::cout << "write: " << m_x << std::endl;
	}
	void read(int *x)
	{
		boost::shared_lock<boost::shared_mutex> lock(rw_mu); // 读锁定
		*x = m_x;
	}
};

void writer(rw_data &data) // 写线程
{
	for (int i = 0; i < 10; ++i)
	{
		boost::this_thread::sleep(boost::posix_time::milliseconds(10)); // 睡眠
		data.write();
	}
}
void reader(rw_data &data) // 读线程
{
	int x;
	for (int i = 0; i < 10; ++i)
	{
		boost::this_thread::sleep(boost::posix_time::milliseconds(5)); // 睡眠
		data.read(&x);
		boost::mutex::scoped_lock lock(io_mu);
		std::cout << "reader: " << x << std::endl;
	}
}
int main()
{

	rw_data d;
	boost::thread_group pool;
	pool.create_thread(boost::bind(reader, boost::ref(d)));
	pool.create_thread(boost::bind(reader, boost::ref(d)));
	pool.create_thread(boost::bind(reader, boost::ref(d)));
	pool.create_thread(boost::bind(reader, boost::ref(d)));
	pool.create_thread(boost::bind(writer, boost::ref(d)));
	pool.create_thread(boost::bind(writer, boost::ref(d)));
	pool.join_all();
	return 0;
}

  

原文地址:https://www.cnblogs.com/ACGame/p/9108440.html