Patch ping

Peter Dimov pdimov@mmltd.net
Fri Oct 7 21:21:00 GMT 2005


>> Or another option would be to eliminate the possible memory leak in
>> some other way.  The possibility of the memory leak arises because
>> two threads may call operator() on a __use_cache simultaneously. When 
>> this happens, it is possible for both threads to test that
>> __caches[__i] is not set, and for both to set it to a new cache
>> object.  In a preemptive threading model, the threads could switch
>> right at the assignment in _M_install_cache, so it seems
>> theoretically possible for the value stored in _M_caches[__index] to
>> be confused by a simultaneous assignment from two threads.  I don't
>> see this can be safely avoided without using a mutex.

Can't this be solved using atomic_compare_exchange (I'm not sure of its 
exact spelling, or whether it's currently part of libstdc++)?

for(;;)
{

if( atomic_load_acquire( __caches[i] ) == 0 )
{
    p = new cache;

    if( !atomic_compare_exchange_release( &__caches[i], 0, p ) )
    {
        // another thread has written to __caches[i] in the meantime
        delete p;
    }
    else
    {
        break;
    }
}

}

or something along those lines.



More information about the Libstdc++ mailing list