170 похожих чатов

Интересная тема :) я тоже думаю, что на практике в

твоем примере std::exit не вызовется. seq_cst более строгая гарантия. в скомпиленном примере там вкорячем mfence, что логично. Но вот действительно ли можно seq_cst миксовать? если да, то когда и зачем? :)

btw, я открыл последний драфт и там вот (n4842, пункт 31.4 -> (4.4) ):
6 [Note: We do not require that S be consistent with “happens before” (6.9.2.1). This allows more efficient
implementation of memory_order::acquire and memory_order::release on some machine architectures.
It can produce surprising results when these are mixed with memory_order::seq_cst accesses. — end note]

7 [Note: memory_order::seq_cst ensures sequential consistency only for a program that is free of data races
and uses exclusively memory_order::seq_cst atomic operations. Any use of weaker ordering will invalidate
this guarantee unless extreme care is used. In many cases, memory_order::seq_cst atomic operations are
reorderable with respect to other atomic operations performed by the same thread. — end note]

если чо, я не настоящий сварщик и, мб, херово распарсил :)

1 ответов

9 просмотров

в теории это тоже работает. Есть такая штука "CppMem: Interactive C/C++ memory model": http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/. Если загнать в неё нашу програмку которая выглядит как-то так: int main() { int v_=0; atomic_int flag_=0; {{{ { v_=1; flag_.store(1,memory_order_seq_cst); } ||| { r1=flag_.load(memory_order_acquire).readsvalue(1); r2=v_; } }}} return 0; } То можно увидеть единственное консистентное выполнение в котором нет гонок. Это даёт возможность описать "почему" в терминах "sequenced-before" и "synchronizes-with" из стандарта (https://en.cppreference.com/w/cpp/atomic/memory_order). Как-то так: В thread_write() потоке non-atomic запись значения 42 в (не-атомарную) переменную v_ "sequenced-before" sequential consistent записи 1цы в (атомарную) переменную ready_. В thread_read() acquire чтение 1цы с (атомарной) переменной ready_ "sequenced-before" non-atomic чтения из переменной v_. Так как запись 1цы в ready_ в первом потоке имеет "synchronizes-with" связь с чтением 1цы с flag-а, то из-за транзитивности имеем то что запись значения 42 в переменную v_ "synchronizes-with" чтением переменной v_. Схематично: [Thread write] Write v_ = 42 -> (sequenced-before) Write flag_ = 1 [Thread read ] Read flag_ == 1 -> (sequenced-before) Read v_ == 42 [Inter-thread] Write flag_ = 1 -> (synchronizes-with) Read Read flag_ == 1 [Conclusion ] Write v_ = 42 -> (synchronizes-with) Read v_ == 42 @antoshkka , если я правильно научился понимать cppmem, то как-то так

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта