说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
用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;	}};

 

《近匠》扬智科技GoWarrior:软硬件全面开源的计算平台 【CTO讲堂】独家直播双十一全网动态?前黑客“劳改”带你玩转大数据 《近匠》好雨云刘凡:提供全方位支持的一站式开发服务云平台 体验过HTC Vive,才知道何谓沉浸感 BDTC 2015:大数据技术精英云集 初版日程公布(表) 我想学汇编~可不知道什么样的书才适合初学者?? 帮帮忙,为什么我的XmlDoc.Load的时候,报路径非法的错误? 为什么下面的代码运行时通不过? samba的疑问,盼高人! 100分求oracle9的疑问 关于ADO读多表数据只能读到一个表,急 学VB不知道看什么书,请各位大侠帮我说说,看什么书好!!1 请问delphi里的随机函数是什么?谢谢 处理CLOB字段遇到的问题,test.txt大于700多字节就不行,600多字节可以。好郁闷 struts问题,如何取得jsp的form中的循环的input? 以为题,写一篇作文要以小见大的,600字 六年级以窗外为题的作文 养生健康品牌词语征集中.1、该词语需要突出 时尚、 《黄帝内经》中关于养生的语句有哪些呢? 请问"养生","养生之道"的英文词是什么? 秋季养生会议宣传语句 翻译成现代汉语 "其他所以养生之具,皆待人力而后完 高中如何读好物理? 中学物理中,需要估读的量有哪些?据我所知,秒表,欧 金正恩参谒牺牲烈士墓地 称心疼得睡不美国无人机再次出手清除巴塔首领 和谈金正恩视察造船厂 吁完成生产科学化现朝军舰疑训练时沉没约30人丧生 金正日媒:日俄防长会议谈及钓鱼岛 集体自作假的照片马刺老了?别开玩笑了!滟紫台全方位诠释生活美学基金子公司自曝通道业务灰幕劝和不劝分三国之超级霸主盗梦高手异能时代灵界美女赢家上下晓起旅游龙井村旅游西湖旅游城隍庙旅游宝峰湖旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘