Yes I learnt those *ByAddress* functions a few months ago and was shocked that Microsoft had plagiarized futex from Linux. As you have pointed out already, those APIs are only available on Windows 8 and later.
If we need fuex semantics on Windows 7 and earlier, we must simulate it. However, since futexes and keyed events work differently, simulation of futexes using keyed events would: 0) require a lot of work, and 1) suffer from performance penalty just like if we simulate keyed events on Windows 2000. The major difference is that, the FUTEX_WAIT syscall is an atomic compare-and-sleep operation, while the NtWaitForKeyedEvent syscall provides no comparison. Instead, the NtReleasedKeyedEvent syscall blocks the current thread until one thread is woken up, while FUTEX_WAKE does nothing and returns immediately. So here is my condition: in no event shall portability harm either efficiency or maintainability. Linux and Windows work differently. I consider it 'harmful' to make one look like the other. ------------------ Best regards, lh_mouse 2016-04-14 ------------------------------------------------------------- 发件人:Torvald Riegel <trie...@redhat.com> 发送日期:2016-04-14 01:40 收件人:lh_mouse 抄送:gcc,mingw-w64-public 主题:Re: Adding a new thread model to GCC On Wed, 2016-04-13 at 17:17 +0800, lh_mouse wrote: > Hi all, > > The 'win32' thread model of gcc has been there since long long ago, being > compatible with very old Windows versions, also having a number of drawbacks: > 0) its implementation is very inefficient, and > 1) its mutexes and condition variables require dynamic initialization and > are unusable in C++11 as std::mutex requires a `constexpr` constructor, and > 2) allocating a number of rarely used mutexes or condition variables would > eventually make the system run out of kernel objects. > > As a solution for 1) and 2), Microsoft introduced keyed events, details of > which can be found here: > http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/ Have you looked at WaitOnAddress and WakeByAddressSingle / WakeByAddressAll too? AFAIK this is new in Windows 8, and seems similar to futexes. I think it might be better to get a std::synchronic (or similar) implementation into GCC, and then use these to implement at least the mutexes: https://github.com/ogiroux/synchronic/blob/master/include/synchronic One benefit would be that we then have one place where we have optimized spinning/blocking in libstdc++ on Windows, and less platform-specific code.