是否有一个跨平台版本的window vista的超薄读写器锁?

时间:2009-12-08 08:04:24

标签: c windows multithreading

我完全被Windows SRW实施的质量所震撼。它比关键部分更快,只有几个字节的内存开销。

不幸的是它只是Windows Vista / Windows 7.

由于这是一个纯粹的用户土地实现,有人知道是否有跨平台实现吗?有人在那里进行逆向工程解决方案吗?

并且我不想添加诸如boost这样的东西只是为了吸引不到100的LOC解决方案。

2 个答案:

答案 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。我写了一个(关闭源代码,我不能分享它)并且它表现出色(实际上比瘦锁更好)。