futephore
From
Bonita Montero@Bonita.Montero@gmail.com to
comp.lang.c++ on Thu Apr 11 13:23:23 2024
From Newsgroup: comp.lang.c++
I tried to implement a counting semaphore with a futex and that's my csolution:
// header:
#include <atomic>
struct futephore
{
futephore() noexcept;
void wait() noexcept;
void notify( uint32_t n );
private:
std::atomic_uint32_t m_releases;
};
inline futephore::futephore() noexcept :
m_releases( 0 )
{
}
// cpp
#include <system_error>
#include "futephore.h"
using namespace std;
void futephore::wait() noexcept
{
for( uint32_t before = m_releases.load( memory_order_relaxed ); ; )
if( before )
if( m_releases.compare_exchange_strong( before, before - 1,
memory_order_acquire, memory_order_relaxed ) )
break;
else
continue;
else
m_releases.wait( 0, memory_order_relaxed ),
before = m_releases.load( memory_order_relaxed );
}
void futephore::notify( uint32_t n )
{
for( uint32_t before = m_releases.load( memory_order_relaxed ); ; )
if( before + n >= before )
if( m_releases.compare_exchange_strong( before, before + n,
memory_order_release, memory_order_relaxed ) )
break;
else
continue;
else
throw system_error( (int)errc::result_out_of_range, generic_category(), "trying to release futefore beyond UINT32_MAX" );
for( ; n; --n, m_releases.notify_one() );
}
--- Synchronet 3.20a-Linux NewsLink 1.114