Re[5]: wikipedia :: Double-checked locking
От: PM  
Дата: 14.12.19 10:56
Оценка:
Здравствуйте, $$, Вы писали:

$>Здравствуйте, Шахтер, Вы писали:

Ш>>Я не понимаю, чего здесь не понятного? Для считывания атомика нужно вызвать load с флагом.


$>Почему бы обычный volatile не использовать? Ведь буков меньше и на до- C++11 компиляторах соберётся.

http://isvolatileusefulwiththreads.in/C++/
Re[5]: wikipedia :: Double-checked locking
От: reversecode google
Дата: 14.12.19 11:43
Оценка:
Здравствуйте, $$, Вы писали:

$>Здравствуйте, Шахтер, Вы писали:

Ш>>Я не понимаю, чего здесь не понятного? Для считывания атомика нужно вызвать 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 программирование
Re[8]: wikipedia :: Double-checked locking
От: $$ Австралия жж
Дата: 14.12.19 20:22
Оценка: -1
Здравствуйте, 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.

Re[9]: wikipedia :: Double-checked locking
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 15.12.19 07:20
Оценка: +1
Здравствуйте, $$, Вы писали:

N>>А вы таки путаетесь в самых основах, лучше повторить.

$>Really? А вам не мешало бы ещё раз перечитать ваше сообщение, на которое ч отвечал, и double check locking.

Really? Реализацию синглтона на одном только InterlockedExchange — в студию.

N>>$>На Java достаточно volatile.

N>>И снова мимо. Явовский volatile ближе всего к std::atomic<> load/store с memory_order_seq_cst.
N>>Но он не даст защиты больше чем на одно чтение/запись. Аналог доступа под мьютексом — это synchronized.
$>

А по сути?
The God is real, unless declared integer.
Re[10]: wikipedia :: Double-checked locking
От: $$ Австралия жж
Дата: 16.12.19 00:54
Оценка:
Здравствуйте, netch80, Вы писали:

N>А по сути?


Попробуйте включить голову: до C++ 11 кто-то писал double check locking.



T* temp = 0;
InterlockedEchangePointer(&s_value, &temp);
T* value = temp;
InterlockedEchangePointer(&s_value, &temp);
if(!value) {
acquireMutex...
}
Отредактировано 16.12.2019 1:23 Артём . Предыдущая версия .
Re[11]: wikipedia :: Double-checked locking
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.12.19 06:44
Оценка:
Здравствуйте, $$, Вы писали:

N>>А по сути?


$>Попробуйте включить голову: до C++ 11 кто-то писал double check locking.

$>T* temp = 0;
$>InterlockedEchangePointer(&s_value, &temp);
$>T* value = temp;
$>InterlockedEchangePointer(&s_value, &temp);
$>if(!value) {
$>acquireMutex...
$>}

Вот именно, что acquireMutex. Всё равно без мьютекса не обошлись. И кому тут надо было включать голову, если в упор не видите в собственном коде?
The God is real, unless declared integer.
Re[12]: wikipedia :: Double-checked locking
От: Шахтер Интернет  
Дата: 16.12.19 07:02
Оценка:
Здравствуйте, 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. Но это, конечно, извращение.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[6]: wikipedia :: Double-checked locking
От: AndrewJD США  
Дата: 16.12.19 16:37
Оценка: +4
Здравствуйте, reversecode, Вы писали:

R>иногда вместо мютексов используют синхронизации на atomic-ах, называется это уже lockfree программирование


Атомики сами по себе не приводят к lockfree. Тот же классический спинлок на атомиках — попрежнему блокирующий алгоритм.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.