gpt4 book ai didi

c++ - Windows 上的快速计数信号量?

转载 作者:行者123 更新时间:2023-11-30 00:57:21 25 4
gpt4 key购买 nike

首先,我知道它可以用互斥锁和条件变量来实现,但我想要尽可能高效的实现。当没有争用时,我想要一个带有快速路径的信号量。在 Linux 上,使用 futex 很容易;例如,这是一个等待:

if (AtomicDecremenIfPositive(_counter) > 0) return; // Uncontended
AtomicAdd(&_waiters, 1);
do
{
if (syscall(SYS_futex, &_counter, FUTEX_WAIT_PRIVATE, 0, nullptr, nullptr, 0) == -1) // Sleep
{
AtomicAdd(&_waiters, -1);
throw std::runtime_error("Failed to wait for futex");
}
}
while (AtomicDecrementIfPositive(_counter) <= 0);
AtomicAdd(&_waiters, -1);

并发布:

AtomicAdd(&_counter, 1);
if (Load(_waiters) > 0 && syscall(SYS_futex, &_counter, FUTEX_WAKE_PRIVATE, 1, nullptr, nullptr, 0) == -1) throw std::runtime_error("Failed to wake futex"); // Wake one

起初我以为 Windows 只使用 NtWaitForKeyedEvent()。问题是它不是直接替换,因为它在进入内核之前不会自动检查 _counter 的值,因此可能会错过 NtReleaseKeyedEvent() 的唤醒。更糟糕的是,NtReleaseKeyedEvent() 会阻塞。什么是最佳解决方案?

最佳答案

Windows 具有 CreateSemaphore 的 native 信号量.除非并且除非您有某种记录在案的性能问题,否则您甚至不应该考虑脆弱的或特定于硬件的优化。

关于c++ - Windows 上的快速计数信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408217/

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