Здравствуйте, ·, Вы писали:
V>>Data race — означает одновременные попытки читать и писать некие данные, или одновременные попытки писать. ·>Да. И ведёт к undefined behaviour.
Докажи.
V>>Соотносятся эти определения следующим образом: data race может быть причиной race condition. ·>Наоборот — race condition может быть причиной data race
Это уже ненормальность, однако. ))
·>если "мы не подумали, что тут лок может не захватиться".
Никаких если.
Ты споришь с базовой терминологией.
Впрочем, однажды я от тебя подобную жесть уже наблюдал.
V>>Но может быть и частью алгоритма. ·>Data race не может быть частью корректного алгоритма, т.к. является undefined behaiour и никакие характеристики алгоритма обеспечить не может.
Докажи.
V>>·>Нет. std::atomic гарантирует отсутсвие data race: V>>Только для тех типов, для которых он специализируется с мьютексом унутре. ·>Это твои фантазии.
Докажи.
V>>·>"A program that has two conflicting evaluations has a data race unless ... both conflicting evaluations are atomic operations (see std::atomic) ..." V>>·>Без всяких оговорок о конкретном memory_order или о том, какими типами они специализированы. V>>На заборе тоже написано... , обычный data race. ·>Это твои фантазии.
Докажи.
·>Ты хочешь сказать что такой код: ·>некорректный, А если добавить signal(SIG_NEVER_HAPPENS, blah) — то всё волшебным образом станет корректно?
Да ты еще и русского языка не понимаешь. ))
Я хочу сказать, что такой код всегда корректный.
Обратное требуется доказать.
V>>Исходники System V доступны, там для обсуждаемых вещей никаких ассемблерных вставок. ·>Не понял что ты имеешь в виду. Дай ссылку что-ли.
Ссылку легко найдёшь сам.
V>>А во вторых, разрешено всё, что не запрещено. ·>Использование типов кроме std::atomic конкурентно запрещено явно.
Не запрещено.
·>Ну запрещено в том смысле, что объявлено как UB.
Объявлено как data race, а не UB.
V>>Вызывать собственный обработчик никем не запрещено. ·>Вызывать можно функцию, а не "обработчик". Функция начинает обрабатывать сигнал, когда ось дёргает её для обработки сигнала. А просто вызов функции работает как... ээ.. вызов функции — со всеми соответствующими гарантиями.
И что тебя смущает?
V>>Т.е., возможны ситуации: V>>- два разных потока обрабатывают два разных сигнала одновременно; V>>- один и тот же поток обрабатывает оба сигнала, причём, второй сигнал залетел реентерабельно, не дожидаясь завершения работы первого обработчика. ·>Это не значит, что они могут шарить данные как хотят.
Могут как хотят.
·>Вообще это два разных механизма сигналы и треды — и требуется очень осторожный подход что можно делать, что нельзя.
В стандарте явно говорится о обработчике сигнала, вызываемого из некоего треда процесса.
"Осторожный подход" тут требуется только если совсем не понимать, что такое прерывание.
Выросло, блин, поколение next...