好库网 好库网首页 | 我的好库
netsin的专栏

用std::atomic實現簡單的讀寫鎖

发布者:netsin
发布日期:2011/11/19 13:43:24   更新日期:2011/11/21 10:02:29
阅读次数:4627
评分:4.80
介绍:用std::atomic實現簡單的讀寫鎖,適合與少量寫入,大量讀取的情況
正文:

 

/hpp file
#include <atomic>
#ifndef ns_mutex_header_
#define ns_mutex_header_
namespace ns
{
	struct mutex
	{
		mutex();	
		void req(int is_read)volatile;
		void unreq(int is_read)volatile;
		inline void req_read(){req(1);}
		inline void req_write(){req(0);}
		inline void unreq_read(){unreq(1);}
		inline void unreq_write(){unreq(0);}

		struct enter
		{
		   enter(mutex* ths_,int is_read_=1):ths(ths_),is_read(is_read_){ths->req(is_read);}
		   ~enter(){ths->unreq(is_read);}
		 private:
			mutex* ths;
			int is_read;
		};
	private:
		std::atomic<uint32_t> read_flags,write_flags;
	};
};
#endif//ns_mutex_header_


#include "ns_mutex.h"
#include <unistd.h>
namespace ns
{
	mutex::mutex()
	{
		write_flags=read_flags=0;
	}
	void mutex::req(int is_read)volatile
	{
		if(is_read)
		{	
	again_read:		
			while(write_flags!=0)usleep(100);			
			++read_flags;
			if(write_flags!=0)
			{
				--read_flags;
				goto again_read;
			}
		}
		else
		{
			uint32_t e(0);
			while(!write_flags.compare_exchange_strong(0,1,e,1))e=0,usleep(100);
			while(read_flags!=0)usleep(100);			
		}
	}
	void mutex::unreq(int is_read)volatile
	{
		if(is_read)--read_flags;
		else --write_flags;
	}
};


 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。