• 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