Информация об изменениях

Сообщение Re[5]: Прошу пояснений по синхронизации acquire-release от 08.02.2017 20:36

Изменено 08.02.2017 20:36 watchmaker

Re[5]: Прошу пояснений по синхронизации acquire-release
Здравствуйте, DTF, Вы писали:

DTF>Так почему не может быть ситуации, когда один поток сделал test_and_set(std::memory_order_acquire), а второй этого еще не увидел и тоже сделал test_and_set(std::memory_order_acquire)?

У тебя вопрос про что? Про memory_order_acquire или про работу с атомарными переменными? Просто это немного разные вещи и не непонятно что тебе именно непонятно.

В описанной ситуации, когда много потоков делают test_and_set(...) над одним и тем же атомарным флагом, будет всегда один итог: флаг будет установлен, ровно один вызов вернёт 0 (в том потоке, которому повезёт захватить блокировку), остальные вернут 1. И это не зависит от того, какой аргумент стоит внутри скобок на месте ...

Почему? Потому что флаг не простой, а атомарный. И действия с ним будут именно что атомарные — именно это является самым важным. И С++ это гарантирует. А как эти гарантии будет реализовывать компилятор, или как там процессор будет кеши синхронизировать, — это уже несколько другие вопросы.
Re[5]: Прошу пояснений по синхронизации acquire-release
Здравствуйте, DTF, Вы писали:

DTF>Так почему не может быть ситуации, когда один поток сделал test_and_set(std::memory_order_acquire), а второй этого еще не увидел и тоже сделал test_and_set(std::memory_order_acquire)?

У тебя вопрос про что? Про memory_order_acquire или про работу с атомарными переменными? Просто это немного разные вещи и непонятно что тебе именно непонятно.

В описанной ситуации, когда много потоков делают test_and_set(...) над одним и тем же атомарным флагом, будет всегда один итог: флаг будет установлен, ровно один вызов вернёт 0 (в том потоке, которому повезёт захватить блокировку), остальные вернут 1. И это не зависит от того, какой аргумент стоит внутри скобок на месте ...

Почему? Потому что флаг не простой, а атомарный. И действия с ним будут именно что атомарные — именно это является самым важным. И С++ это гарантирует. А как эти гарантии будет реализовывать компилятор, или как там процессор будет кеши синхронизировать, — это уже несколько другие вопросы.