亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mutex.h

?? firtext搜索引擎源碼
?? H
字號:
//// Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. // All rights reserved.// This file is part of FirteX (www.firtex.org)//// Use of the FirteX is subject to the terms of the software license set forth in // the LICENSE file included with this software, and also available at// http://www.firtex.org/license.html
//// Author	: 郭瑞杰(GuoRuijie)// Email	: ruijieguo@software.ict.ac.cn,ruijieguo@gmail.com// Created	: 2005/11/20//
#ifndef _MUTEX_WIN32_H
#define _MUTEX_WIN32_H

#include "thread/Lockable.h"
#include "thread/NonCopyable.h"
#include "utility/Exception.h"
#include "thread/ReadWriteLock.h"
#include <windows.h>
#include <map>

namespace firtex
{
	namespace thread
	{
		class CMutex : public CLockable//,private CNonCopyable
		{
			//mutable CRITICAL_SECTION m_CS;
			CRITICAL_SECTION m_CS;
		public:
			CMutex()
			{
				InitializeCriticalSection(&m_CS); 
			}

			virtual ~CMutex()
			{
				DeleteCriticalSection(&m_CS);
			}

			void acquire()
			{
				EnterCriticalSection(&m_CS);
			}

#if(_WIN32_WINNT >= 0x0400)
			bool tryAcquire(unsigned long timeout)
			{
				return (TryEnterCriticalSection(&m_CS)?true:false); 
			}
#else
			bool tryAcquire(unsigned long timeout)
			{
				return true; 
			}
#endif


			void release()
			{
				LeaveCriticalSection(&m_CS);
			}
		};

		class CReadWriteMutex : public ReadWriteLock
		{
			typedef std::map<DWORD,DWORD> CMapThreadToState;
		public:
			CReadWriteMutex();
			virtual ~CReadWriteMutex();
		public:
			/**			 * Get a reference to the read-only Lockable.			 * @return <em>Lockable&</em> reference to a Lockable that provides read-only access.			 */			virtual CLockable& getReadLock();			/**			 * Get a reference to the read-write Lockable.			 * @return <em>Lockable&</em> reference to a Lockable that provides read-write access.			 */			virtual CLockable& getWriteLock();

		protected:
			class RLock : public CLockable
			{
				CReadWriteMutex& m_rwLock;
			public:
				RLock(CReadWriteMutex& rwLock) : m_rwLock(rwLock)
				{
				}
				virtual ~RLock(){}
			public:
				virtual void acquire();
				virtual bool tryAcquire(unsigned long timeout);
				virtual void release();			
			};

			class WLock : public CLockable
			{
				CReadWriteMutex& m_rwLock;
			public:
				WLock(CReadWriteMutex& rwLock) : m_rwLock(rwLock)
				{
				}
				virtual ~WLock(){}
			public:
				virtual void acquire();

				virtual bool tryAcquire(unsigned long timeout);

				virtual void release();
			protected:			
			};

		public:			
			void acquireWriterLock();
			void releaseWriterLock();
			void acquireReaderLock();
			void releaseReaderLock();
		protected:			
			/// Internal/Real implementation
			inline void acquireReaderLock_i();
			inline void releaseReaderLock_i();
			inline void acquireWriterLock_i(bool bMustWait);
			inline void releaseWriterLock_i(bool bDowngrade);
		private:
			/// A critical section to guard all the other members
			mutable CRITICAL_SECTION	m_cs;
			
			/// Auto-reset event, will be dynamically created/destroyed on demand
			HANDLE				m_hSafeToWriteEvent;
			
			/// Manual-reset event, will be dynamically created/destroyed on demand
			HANDLE				m_hSafeToReadEvent;
			
			/// Total number of writers on this object
			int					m_nNumOfWriter;
			
			/// Total number of readers have already owned this object
			int					m_nNumOfReaderEntered;
			
			/// Total number of readers are waiting to be owners of this object
			int					m_nNumOfReaderWaiting;		
			
			CMapThreadToState	m_map;

			RLock				m_rLock;			WLock				m_wLock;

			friend class RLock;			friend class WLock;		
		};

		class CNullMutex
		{
		public:
			CNullMutex(){}
			~CNullMutex(){}
		public:
			inline void acquire(){}
			inline bool tryAcquire(unsigned long timeout){return true;}
			inline void release(){}
		};

		class CNullRWMutex : public ReadWriteLock
		{
		public:
			CNullRWMutex(){}
			virtual~CNullRWMutex(){}
		public:
			/**			 * Get a reference to the read-only Lockable.			 * @return <em>Lockable&</em> reference to a Lockable that provides read-only access.			 */			virtual CLockable& getReadLock(){return m_rLock;}			/**			 * Get a reference to the read-write Lockable.			 * @return <em>Lockable&</em> reference to a Lockable that provides read-write access.			 */			virtual CLockable& getWriteLock(){return m_wLock;}
		protected:
			class NullRLock : public CLockable
			{
			public:
				NullRLock();
				~NullRLock();
			public:
				void acquire(){}
				bool tryAcquire(unsigned long timeout){return true;}
				void release(){}
			};

			class NullWLock : public CLockable
			{
			public:
				NullWLock();
				~NullWLock();
			public:
				void acquire(){}
				bool tryAcquire(unsigned long timeout){return true;}
				void release(){}
			};
		protected:
			NullRLock m_rLock;
			NullWLock m_wLock;
		
		};		

		//////////////////////////////////////////////////////////////////////////
		///
		inline void CReadWriteMutex::acquireReaderLock_i()
		{
			if(m_nNumOfWriter)
			{
				++m_nNumOfReaderWaiting;
				if(NULL == m_hSafeToReadEvent)
				{
					//////////////////////////////////////////////////////
					// This is a long-time task inside Critical Section
					// However, there isn't any effective way to overcome
					m_hSafeToReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
				}

				do
				{
					LeaveCriticalSection(&m_cs);
					WaitForSingleObject(m_hSafeToReadEvent, INFINITE);
					// There might be one or more Writers entered, that's
					// why we need DO-WHILE loop here
					EnterCriticalSection(&m_cs);
				}
				while(m_nNumOfWriter);

				// Enter successful after wait
				++m_nNumOfReaderEntered;

				if(0==--m_nNumOfReaderWaiting)
				{
					HANDLE hTemp = m_hSafeToReadEvent;
					m_hSafeToReadEvent = NULL;
					LeaveCriticalSection(&m_cs);

					CloseHandle(hTemp);
				}
				else
				{
					LeaveCriticalSection(&m_cs);
				}
			}
			else
			{
				// Enter successful without wait
				++m_nNumOfReaderEntered;
				LeaveCriticalSection(&m_cs);
			}
		}
		inline void CReadWriteMutex::releaseReaderLock_i()
		{
			int  nNumOfReaderEntered = --m_nNumOfReaderEntered;
			FIRTEX_ASSERT2(0 <= nNumOfReaderEntered);

			if( (0 == nNumOfReaderEntered) && (NULL != m_hSafeToWriteEvent) )
			{
				LeaveCriticalSection(&m_cs);

				/// INTERESTING point: We signal one of queued WRITERs outside
				/// Critical Section without any problem in logic but better
				/// in performance
				SetEvent(m_hSafeToWriteEvent);
			}
			else
			{
				LeaveCriticalSection(&m_cs);
			}
		}
		inline void CReadWriteMutex::acquireWriterLock_i(bool bMustWait)
		{
			// Increase Writer-counter & reset Reader-event if necessary
			int nNumOfWriter = ++m_nNumOfWriter;
			if(	(1 == nNumOfWriter) && (NULL != m_hSafeToReadEvent) )
			{
				ResetEvent(m_hSafeToReadEvent);
			}

			if(bMustWait && (NULL == m_hSafeToWriteEvent) )
			{
				m_hSafeToWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
			}
			LeaveCriticalSection(&m_cs);

			if(bMustWait)
			{
				WaitForSingleObject(m_hSafeToWriteEvent, INFINITE);
			}
		}
		inline void CReadWriteMutex::releaseWriterLock_i(bool bDowngrade)
		{
			FIRTEX_ASSERT2(0 == m_nNumOfReaderEntered);

			if(bDowngrade)
			{
				++m_nNumOfReaderEntered;
			}

			if(0 == --m_nNumOfWriter)
			{
				if(m_hSafeToReadEvent)
				{
					/// This is a long-time task inside Critical Section
					/// However, there isn't any effective way to overcome
					SetEvent(m_hSafeToReadEvent);
				}

				if(m_hSafeToWriteEvent)
				{
					HANDLE hTemp = m_hSafeToWriteEvent;
					m_hSafeToWriteEvent = NULL;
					LeaveCriticalSection(&m_cs);

					/// Close handle outside CS to increase throughput
					CloseHandle(hTemp);
				}
				else
				{
					LeaveCriticalSection(&m_cs);
				}
			}
			else
			{
				//////////////////////////////////////////////////////////////////////////
				// Some WRITERs are queued
				FIRTEX_ASSERT2( (0 < m_nNumOfWriter) && (NULL != m_hSafeToWriteEvent));
				LeaveCriticalSection(&m_cs);

				if(false == bDowngrade)
				{

					/// INTERESTING point: We signal one of queued WRITERs outside
					/// Critical Section without any problem in logic but better
					/// in performance
					SetEvent(m_hSafeToWriteEvent);			
				}
			}
		}
	}
}


#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区欧美亚洲| 粉嫩av一区二区三区| 国产精品亚洲第一| 欧美日韩国产不卡| 综合色中文字幕| 精品一区二区免费在线观看| 成人高清视频免费观看| 日韩一区二区三区在线| 亚洲福利国产精品| 在线观看国产一区二区| 国产欧美日本一区二区三区| 男女视频一区二区| 欧美日韩精品免费| 玉米视频成人免费看| 成人动漫视频在线| 国产午夜精品一区二区三区嫩草| 日本网站在线观看一区二区三区| 在线一区二区三区| 亚洲视频 欧洲视频| 顶级嫩模精品视频在线看| 精品乱码亚洲一区二区不卡| 午夜精品久久久久久| 在线观看av一区| 一区二区三区欧美视频| 一本久久综合亚洲鲁鲁五月天| 国产精品日产欧美久久久久| 国产精品99久久久久久似苏梦涵| 久久久久久久综合狠狠综合| 精品一区二区三区欧美| 欧美电影免费观看高清完整版在| 视频一区二区欧美| 91精品国产麻豆| 人禽交欧美网站| 91精品国产91久久久久久一区二区| 亚洲地区一二三色| 欧美三级欧美一级| 午夜成人免费视频| 日韩精品一区二区三区视频播放 | 日韩手机在线导航| 麻豆精品精品国产自在97香蕉| 欧美欧美欧美欧美| 久久精品国产精品亚洲精品| 久久久久久久性| www.亚洲精品| 亚洲综合区在线| 欧美一区二区三区视频在线观看| 久久精品国产精品亚洲综合| 久久久久久久久99精品| jlzzjlzz国产精品久久| 一区二区三区久久久| 91精品免费观看| 九九在线精品视频| 国产精品初高中害羞小美女文| 99麻豆久久久国产精品免费 | 日本一区二区三区视频视频| 国产91在线观看丝袜| 一区二区三区在线视频观看58| 欧美日韩一区二区欧美激情| 美腿丝袜亚洲三区| 国产精品美女一区二区在线观看| 日本丶国产丶欧美色综合| 青青国产91久久久久久| 欧美α欧美αv大片| 懂色av一区二区三区免费看| 一区二区三区不卡视频在线观看| 日韩一区二区三区观看| 成人亚洲精品久久久久软件| 亚洲一二三四在线观看| 2020国产精品久久精品美国| 91在线一区二区三区| 日韩精品乱码av一区二区| 中文字幕欧美日本乱码一线二线| 欧美日韩dvd在线观看| 国产精品88av| 日韩av成人高清| 亚洲欧洲三级电影| 日韩亚洲电影在线| 91官网在线免费观看| 久久99精品久久久久久久久久久久| 国产精品久久久久四虎| 欧美大片在线观看一区二区| 色香蕉久久蜜桃| 国产成人免费在线观看| 日本不卡一二三区黄网| 亚洲男人天堂av| 久久精品人人爽人人爽| 91精品欧美福利在线观看| 色婷婷综合激情| 成人影视亚洲图片在线| 午夜欧美视频在线观看| 国产精品久久久久影院亚瑟| 久久久噜噜噜久久中文字幕色伊伊| 欧美午夜精品一区二区蜜桃| aa级大片欧美| 国产成人鲁色资源国产91色综| 亚洲午夜成aⅴ人片| 亚洲精品美国一| 国产精品久线在线观看| 日本一区二区三区四区| 26uuu亚洲| 精品久久久久久综合日本欧美| 911国产精品| 欧美日本精品一区二区三区| 欧美三级中文字幕在线观看| 91理论电影在线观看| 色琪琪一区二区三区亚洲区| 99热精品国产| 在线精品视频一区二区| 色哟哟在线观看一区二区三区| 91色九色蝌蚪| 一本色道久久综合亚洲aⅴ蜜桃| www.亚洲在线| 色综合天天综合网国产成人综合天 | 亚洲国产日产av| 亚洲免费观看高清| 亚洲素人一区二区| 中文字幕一区二区在线观看| 国产精品区一区二区三区| 国产欧美日韩在线观看| 国产亚洲一区二区三区| 国产日韩一级二级三级| 国产亚洲午夜高清国产拍精品| 久久无码av三级| 国产清纯在线一区二区www| 久久久www成人免费毛片麻豆| 久久精品人人爽人人爽| 国产精品毛片大码女人| 中文字幕在线免费不卡| 一区二区在线观看视频在线观看| 亚洲乱码精品一二三四区日韩在线 | 国产精品欧美经典| 亚洲色图欧洲色图| 亚洲午夜免费福利视频| 天堂一区二区在线| 国产一区二区三区免费播放 | 麻豆精品在线观看| 国产盗摄一区二区| 色婷婷av一区二区三区软件| 51精品秘密在线观看| 精品国产亚洲在线| 国产精品美日韩| 亚洲高清视频中文字幕| 精品在线视频一区| 99精品视频一区| 欧美一个色资源| 国产精品毛片无遮挡高清| 亚洲激情欧美激情| 美女爽到高潮91| 91香蕉视频mp4| 日韩欧美一级二级| 国产精品久久久一本精品| 亚洲一区二区在线免费看| 美日韩黄色大片| 一本大道av伊人久久综合| 欧美精品自拍偷拍| 国产精品久线在线观看| 日韩精品一二三区| 99麻豆久久久国产精品免费 | 国产酒店精品激情| 在线免费精品视频| 久久久精品国产免大香伊| 亚洲一区在线观看免费| 国产成人精品1024| 日韩欧美一区二区不卡| 亚洲三级免费电影| 国产一区二区三区四区五区入口| 91在线观看地址| 久久久久久综合| 午夜精品久久久久影视| 一本久道久久综合中文字幕| 亚洲精品在线电影| 日韩在线一区二区三区| 99re成人在线| 国产精品理论片在线观看| 狠狠狠色丁香婷婷综合激情| 91麻豆精品国产91久久久使用方法 | 色美美综合视频| 国产夜色精品一区二区av| 视频一区二区国产| 欧美色男人天堂| 亚洲视频一区在线观看| 成人高清免费观看| 久久亚洲欧美国产精品乐播| 日韩高清在线一区| 欧美日韩黄色影视| 亚洲国产wwwccc36天堂| 91小视频在线免费看| 亚洲丝袜自拍清纯另类| 99精品热视频| 中文字幕日韩一区二区| 欧美日本一区二区三区四区| 亚洲视频免费看| 91国产福利在线| 亚洲综合成人在线| 欧美网站一区二区| 亚洲一区免费在线观看| 在线看日韩精品电影| 亚洲大片在线观看| 欧美群妇大交群的观看方式| 亚洲成人动漫一区|