Доброго времени суток. Читаю исходники буста, нахожу там этот класс. Класс реализован для нескольких платформ (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;
}
Это корректно? Спасибо.