Sujet : Re: Futexes ain't fast
De : chris.m.thomasson.1 (at) *nospam* gmail.com (Chris M. Thomasson)
Groupes : comp.lang.c++Date : 29. Aug 2024, 20:20:59
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vaqhmr$2r8p$7@dont-email.me>
References : 1 2 3 4 5 6 7 8
User-Agent : Mozilla Thunderbird
On 8/29/2024 7:30 AM, Bonita Montero wrote:
This is by far the fastest code:
#if defined(_WIN32)
HANDLE hSem = CreateSemaphoreA( nullptr, 0, 0x7FFFFFFF, nullptr );
auto acquire = [&] { WaitForSingleObject( hSem, INFINITE ); };
auto release = [&] { ReleaseSemaphore( hSem, 1, nullptr ); };
^^^^^^^^^^^^^^^^^^^^^^
Actually, release can be SetEvent because the mutex logic only needs a binary semaphore, or an event on windows. However, I cannot remember if an event is "faster" than a semaphore on windows or not. Still do not know how windows handles it's futexes wrt internal impl. WaitOnAddress and such.
#elif defined(__unix__)
sem_t sem;
sem_init( &sem, 0, 0 );
auto acquire = [&] { while( sem_wait( &sem ) == EINTR ); };
auto release = [&] { sem_post( &sem ); };
#endif
tests.emplace_back( "CT-Sema", [&]
{
if( ctFutex.exchange( 1, memory_order_acquire ) )
while( ctFutex.exchange( 2, memory_order_acquire ) )
acquire();
if( ctFutex.exchange( 0, memory_order_release ) == 2 )
release();
} );