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

标签 c++ multithreading winapi synchronization semaphore

首先,我知道它可以用互斥锁和条件变量来实现,但我想要尽可能高效的实现。 当没有争用时,我想要一个带有快速路径的信号量。在 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/

相关文章:

c - 在 C 中获取进程时间的问题(请帮助我)

c - 将具有 NULL 字节的 C 字符串转换为 char 数组

.net - 用于音频演示的GUI控件

C++ 加法运算符

javascript - N-API C++ 插件导致 Electron GUI 阻塞

java - 如何在Java中正确创建和实现ThreadPool类型的类

Python:每 x 分钟交替一次函数

multithreading - Perl 恢复一个线程

c++ - 复合参数声明

c - 如果WriteFile同步完成,是否发出信号通知事件