Атомарность? boost::detail::atomic_count
От: Аноним  
Дата: 26.08.09 19:54
Оценка:
Доброго времени суток. Читаю исходники буста, нахожу там этот класс. Класс реализован для нескольких платформ (boost/smart_ptr/detail/atomic_count_*). Есть пара непонятных моментов. Смотрю реализацию для Windows, компилятор MSVC:
operator long() const
{
    return static_cast<long const volatile &>( value_ );
}

Как понимаю, здесь это делается для избежания нежелательной оптимизации? Так-ли это?

Смотрю дальше. Вариант для gcc 4 (с использованием встроенных __sync*), и для gcc3:
operator long() const
{
    return __sync_fetch_and_add( &value_, 0 );
}

using __gnu_cxx::__exchange_and_add;
...
operator long() const
{
    return __exchange_and_add( &value_, 0 );
}

Почему здесь так делается? И почему нельзя использовать вариант, реализованный для msvc?

Еще вопрос — насколько корректно присваивание значения разделяемой для нескольких потоков переменной типа long? Т.е. если для указанного atomic_count добавить:
atomic_count& operator=(long value)
{
    m_value = value;
}

Это корректно? Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.