我完全從Windows SRW實施的質量中脫穎而出。它的關鍵部分速度更快,其內存開銷只有幾個字節。是否有窗口vista的超薄讀寫器鎖的跨平臺版本?
遺憾的是,只有Windows Vista/Windows 7的
由於這是一個純粹的用戶實行土地,沒有任何人知道,如果有是它的一個跨平臺的實現?有沒有人反向工程解決方案?
並請我不希望添加的東西像升壓只是在小於100 LOC解決拉。
我完全從Windows SRW實施的質量中脫穎而出。它的關鍵部分速度更快,其內存開銷只有幾個字節。是否有窗口vista的超薄讀寫器鎖的跨平臺版本?
遺憾的是,只有Windows Vista/Windows 7的
由於這是一個純粹的用戶實行土地,沒有任何人知道,如果有是它的一個跨平臺的實現?有沒有人反向工程解決方案?
並請我不希望添加的東西像升壓只是在小於100 LOC解決拉。
如果你想要的東西在符合某些標準的...如果你正在使用POSIX線程的意義上的「便攜式」有pthread_rwlock_init()
和朋友。這些當然不是在Windows上使用,而是在Unix類型的操作系統上使用。
但是,如果您的意思是「便攜式」,意思是「可移植到多個版本的Windows ...」,那麼在ntdll
中有一些實現RW鎖的未公開的調用。 RtlAcquireResourceShared()
和RtlAcquireResourceExclusive()
。
下面是一些原型來自WINE's implementation:
void WINAPI RtlInitializeResource(LPRTL_RWLOCK rwl);
void WINAPI RtlDeleteResource(LPRTL_RWLOCK rwl);
BYTE WINAPI RtlAcquireResourceExclusive(LPRTL_RWLOCK rwl, BYTE fWait);
BYTE WINAPI RtlAcquireResourceShared(LPRTL_RWLOCK rwl, BYTE fWait);
void WINAPI RtlReleaseResource(LPRTL_RWLOCK rwl);
注意您可能需要GetProcAddress()
這些從ntdll.dll
自己。
至於引用的結構......這裏是什麼酒聲明:
typedef struct _RTL_RWLOCK {
RTL_CRITICAL_SECTION rtlCS;
HANDLE hSharedReleaseSemaphore;
UINT uSharedWaiters;
HANDLE hExclusiveReleaseSemaphore;
UINT uExclusiveWaiters;
INT iNumberActive;
HANDLE hOwningThreadId;
DWORD dwTimeoutBoost;
PVOID pDebugInfo;
} RTL_RWLOCK, *LPRTL_RWLOCK;
如果你不想使用並行線程,你不想鏈接到粗略無證功能...你可以查找一個rwlock實現,並根據其他操作自己實現它...說InterlockedCompareExchange()
,或者更高級別的基元,如信號量和事件。
可以使用同樣的想法一樣苗條rwlock中(至少是我想象他們這麼做,因爲這是相當簡單)當然滾你自己。我在this other question中詳細介紹了該方法。
對於你的情況,你可以忽略大多是「公平」方面,但實現基本相同。尤其是,如果你願意讓無限期的讀者阻止作者,那麼當讀者已經擁有讀者的時候,你總是讓讀者進入(即狀態(2)和(3)或多或少都會崩潰)。
對於您的情況,對於跨平臺角度,您需要實現使用或窗口事件或pthread condvars的阻塞 - 但兩種情況的細節都相似。或者,如果你真的想避免阻塞,你唯一的選擇就是旋轉(理想情況下,使用pause
指令對CPU很好),通過將整個回退消除到阻塞代碼,使事情變得更容易。
一個很好的實現可能是幾百LOC。我寫了一篇(關閉源代碼,我無法分享它),並且它表現出色(實際上比超薄鎖定更好)。
好吧,我不希望系統調用,這是不是SRW代碼。他們很快。我想要的是一些裸露的C/Assembler代碼,它正在執行InterlockedCompareExchange魔術。如果使用相同的彙編程序語法,則應該按照定義在英特爾i386或amd64平臺上移植。 – Lothar 2009-12-08 08:42:40
在這種情況下:http://www.google.com/search?q=rwlock+interlockedcompareexchange - 還要注意InterlockedCompareExchange()的x86指令是「lock cmpxchg」。 – asveikau 2009-12-08 08:45:32
@Lothar - 如果你想要適當的阻塞 - 即線程無法獲得鎖定,它就應該進入睡眠狀態,那麼你無法完全避免系統調用。系統調用只發生在爭用的情況下 - 如果你不需要系統調用,唯一的選擇是旋轉循環,非常多。我在下面添加了一個答案,描述瞭如何推出自己的答案。 – BeeOnRope 2016-10-13 17:49:54