$>Здравствуйте, Шахтер, Вы писали:
Ш>>Я не понимаю, чего здесь не понятного? Для считывания атомика нужно вызвать load с флагом.
$>Почему бы обычный volatile не использовать? Ведь буков меньше и на до- C++11 компиляторах соберётся.
volatile это всего лишь директива компилятору не оптимизировать доступ к переменной, т.е. не кешировать
int a = 1;
while (a){}
компилятор может соптимизировать в регистры или стек и сделать
int b = a;
while (b){}
очевидно что с другого потока если изменить "a" то первый не увидит у себя в цикле изменения
а вот гарантии в каком порядке CPU изменят и увидят эти изменения "a" уже дает atomic
на всяких x86 платформах это не имеет особо значения
а вот на arm,ppc уже ой как актуально
а гарантии того что этот "a" не изменится другим треидом в ОС дают мютексы
иногда вместо мютексов используют синхронизации на atomic-ах, называется это уже lockfree программирование
Здравствуйте, netch80, Вы писали:
N>>>До C++11 можно было платформенно-зависимые функции применять. N>$>Ага, InterlockedExchange. Подзабыл уже.
N>При чём тут это? InterlockedExchange не имеет уже никакого смысла, если мы под мьютексом, который защищает доступ к переменной (и все участники соблюдают это). Он нужен, если мы стараемся обойти без мьютекса — но в этом случае в C++11 есть свой atomic_exchange. N>Про платформенно-зависимые я имел в виду, что где-то pthread_mutex_lock, где-то WaitForSingleObject над мьютексом.
N>А вы таки путаетесь в самых основах, лучше повторить.
Really? А вам не мешало бы ещё раз перечитать ваше сообщение, на которое ч отвечал, и double check locking.
N>$>На Java достаточно volatile.
N>И снова мимо. Явовский volatile ближе всего к std::atomic<> load/store с memory_order_seq_cst. N>Но он не даст защиты больше чем на одно чтение/запись. Аналог доступа под мьютексом — это synchronized.
Здравствуйте, $$, Вы писали:
N>>А вы таки путаетесь в самых основах, лучше повторить.
$>Really? А вам не мешало бы ещё раз перечитать ваше сообщение, на которое ч отвечал, и double check locking.
Really? Реализацию синглтона на одном только InterlockedExchange — в студию.
N>>$>На Java достаточно volatile. N>>И снова мимо. Явовский volatile ближе всего к std::atomic<> load/store с memory_order_seq_cst. N>>Но он не даст защиты больше чем на одно чтение/запись. Аналог доступа под мьютексом — это synchronized.
$>
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, $$, Вы писали:
N>>>А по сути?
N>$>Попробуйте включить голову: до C++ 11 кто-то писал double check locking.
N>$>T* temp = 0; N>$>InterlockedEchangePointer(&s_value, &temp); N>$>T* value = temp; N>$>InterlockedEchangePointer(&s_value, &temp); N>$>if(!value) { N>$>acquireMutex... N>$>}
N>Вот именно, что acquireMutex. Всё равно без мьютекса не обошлись. И кому тут надо было включать голову, если в упор не видите в собственном коде?
Мьютекс можно заменить на спинлок, который реализуется на InterlockedIncrement/Decrement. Но это, конечно, извращение.