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