gpt4 book ai didi

c - windows vista 的 slim reader writer locks 有跨平台版本吗?

转载 作者:可可西里 更新时间:2023-11-01 09:26:56 25 4
gpt4 key购买 nike

Windows SRW 实现的质量让我大吃一惊。它比临界区更快,而且只有几个字节的内存开销。

很遗憾,它只有 Windows Vista/Windows 7。

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

我不想添加像 boost 这样的东西只是为了引入少于 100 LOC 的解决方案。

最佳答案

如果您想要某种符合某些标准的“便携”东西...如果您使用的是 POSIX 线程,则有 <a href="http://opengroup.org/onlinepubs/007908775/xsh/pthread_rwlock_init.html" rel="noreferrer noopener nofollow">pthread_rwlock_init()</a>和 friend 。这些当然不是通常用于 Windows,而是用于 Unix 类型的操作系统。

但是,如果您指的是“可移植到多个版本的 Windows...”意义上的“可移植”,则在 ntdll 中有一些未记录的调用实现 RW 锁。 RtlAcquireResourceShared()RtlAcquireResourceExclusive() .

以下是来自 WINE's implementation 的一些原型(prototype):

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);

请注意,您可能需要 <a href="http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx" rel="noreferrer noopener nofollow">GetProcAddress()</a>这些来自 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;

如果您不想使用 pthreads 并且不想链接到粗略的未记录功能...您可以查找 rwlock 实现并根据其他操作自行实现...说 <a href="http://msdn.microsoft.com/en-us/library/ms683560(VS.85).aspx" rel="noreferrer noopener nofollow">InterlockedCompareExchange()</a> ,或者更高级别的原语,例如信号量和事件。

关于c - windows vista 的 slim reader writer locks 有跨平台版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com