我完全被Windows SRW实施的质量所震撼。它比关键部分更快,只有几个字节的内存开销。
不幸的是它只是Windows Vista / Windows 7.
由于这是一个纯粹的用户土地实现,有人知道是否有跨平台实现吗?有人在那里进行逆向工程解决方案吗?
并且我不想添加诸如boost这样的东西只是为了吸引不到100的LOC解决方案。
答案 0 :(得分:3)
如果你想要符合某种标准的“便携式”东西......如果你使用的是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
这些。
至于引用的结构......这是WINE声明的内容:
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;
如果您不想使用pthread并且您不想链接到粗略的未记录的功能......您可以查找rwlock实现并根据其他操作自行实现...说{{1或者更高级的原语,如信号量和事件。
答案 1 :(得分:0)
你当然可以使用与slim rwlock相同的想法来推销自己(至少我想象他们做过,因为这是相当简单的)。我在this other question中详细概述了这种方法。
对于你的情况,你可以大多忽略" fair"方面,但实现基本相同。特别是,如果你愿意让一个无限期的读者群阻止作者,你总是让读者进入当锁已经有读者的时候(即状态(2)和(3)或多或少地一起崩溃)。
在您的情况下,对于跨平台角度,您需要使用 窗口事件或pthread condvars来实现阻止 - 但在任何一种情况下细节都类似。或者,如果您真的想要完全避免阻塞,那么您唯一的选择就是旋转(理想情况下使用pause
指令对CPU很好),这样可以通过删除整个回退到阻塞代码来使事情变得更容易。 / p>
一个好的实现可能是几百个LOC。我写了一个(关闭源代码,我不能分享它)并且它表现出色(实际上比瘦锁更好)。