
Anton
19.09.2018
16:57:36
lock-free вот это вот всё

Antony
19.09.2018
16:57:39
и нет, они не атомарные

Anton
19.09.2018
16:57:49

Max
19.09.2018
16:57:55

Google

39170
19.09.2018
16:57:57
Друзья! Вопрос, к сожалению, не про реальный мир, а про стандарт. Насколько я понял до текущего момента, стандарт абстрагирует треды под термин execution agent (an entity such as thread that may perform work in parallel with other execution agents), и добавляет замечание (Implementations or users may introduce other inds of agents such as processes or thread-poll tasks). И, подобно им, вводит концепции BasicLockable и Lockable типов, над unlock-lock вызовами которых работает syncronize-with отношение

Antony
19.09.2018
16:58:42

/dev
19.09.2018
16:59:07

Antony
19.09.2018
16:59:30
почему?
потому что операции инкремента/декремента не будут видны в других потоках
потому что операции записи и чтения значения будут работать не так, как вы ожидаете

Anton
19.09.2018
17:00:02

/dev
19.09.2018
17:00:44

39170
19.09.2018
17:00:55

Antony
19.09.2018
17:01:30

Max
19.09.2018
17:01:44

Alexander
19.09.2018
17:01:45

/dev
19.09.2018
17:01:49

Alexander
19.09.2018
17:01:59
потому что volatile не добавляет такой семантики

/dev
19.09.2018
17:02:18
на каком-нибудь обрубке без кешей volatile, да, сделает своё дело

Google

/dev
19.09.2018
17:02:24
Но где такие остались?

Antony
19.09.2018
17:02:56
Ну вот ни разу не правда: https://godbolt.org/z/qv__KG
немного про разницу:
lock xadd DWORD PTR a[rip], eax - сразу меняет значение в памяти
mov eax, DWORD PTR s[rip] - читает значение из памяти в регистр
add eax, 1 - меняет регистр
mov DWORD PTR s[rip], eax - записывает регистр обратно
во втором случае, при операции "add eax, 1" другой поток может поменять значение и записать его в память. Мы же новое значение перетрём своим

Alex
19.09.2018
17:09:49

Anton
19.09.2018
17:10:03
volatile обрубает кэширование вроде
там только барьера не хватать будет для полноценного atomic

Antony
19.09.2018
17:11:36

Anton
19.09.2018
17:12:37
если в одном потоке while (val) { do something }, в другом val = 0, если val - это volatile int на 32-х битном процессоре, будет норм работать )
я вот про такие простые вещи, если что

Max
19.09.2018
17:12:49

Anton
19.09.2018
17:12:56
писал же, что барьера нет

Antony
19.09.2018
17:13:58

Max
19.09.2018
17:14:13

Anton
19.09.2018
17:14:34
речь о ситуациях когда это не важно

Antony
19.09.2018
17:15:06

Anton
19.09.2018
17:15:10

Antony
19.09.2018
17:16:29

Google

Anton
19.09.2018
17:16:52
это редкие ситуации, когда стандартный лок из ОС по какой-то причине не устраивает (слишком медленный например)

Antony
19.09.2018
17:18:03
это что за суровый embedded такой, где архитектура x86 и много ядер?

Anton
19.09.2018
17:18:16

Alex Фэils?︙
19.09.2018
17:18:28

Anton
19.09.2018
17:18:29
и много ядер сейчас почти везде )

Alex
19.09.2018
17:18:43

Anton
19.09.2018
17:19:03
слишком молодой )

Alex
19.09.2018
17:19:18
Да и сервера есть

Anton
19.09.2018
17:19:32

Antony
19.09.2018
17:19:59

Anton
19.09.2018
17:20:13
кароч, я не спорю, что std::atomic здорово, просто вопросы по фактам были

Alex
19.09.2018
17:21:29

Anton
19.09.2018
17:21:46
:)

Antony
19.09.2018
17:22:40
Ну блин, обновление тулчейна раз в год-два даёт ~10% прироста производительности
Это какие-то нездоровые наклонности - писать volatile чтобы что-то там сэкономить (ценой простреленных ног), и при этом не обновлять тулчейн (даст намного больший прирост производительности)

Google

Alexander
19.09.2018
17:22:51

Anton
19.09.2018
17:23:09

Antony
19.09.2018
17:23:27
ух, жуть

Anton
19.09.2018
17:23:34

Antony
19.09.2018
17:24:09
если вы на подобном arm будете пользоваться операционкой без вытесняющей многозадачночти, то может не замечать изменений крайне долго

39170
19.09.2018
17:25:14
очень редко когда надо писать такое говно )
Блин, вообще, вопрос я задал, потому что именно такой код ( :))) ), написал мой коллега, где val был volatile, и я начал раскидываться цитатами из Стандарта про UB. А треды использовались Qtшные и коллега возражал, что так как это не стандартные треды и примитивы синхронизации, то эти цитаты из Стандарта не эпплаятся

Antony
19.09.2018
17:26:04
с вытесняющей многозадачностью полегче - рано или поздно ОС вытестин ваш цикл, зафлашит кеши

Anton
19.09.2018
17:26:34

Max
19.09.2018
17:26:57

Antony
19.09.2018
17:27:10

Anton
19.09.2018
17:27:29

Max
19.09.2018
17:27:57
Блин, вообще, вопрос я задал, потому что именно такой код ( :))) ), написал мой коллега, где val был volatile, и я начал раскидываться цитатами из Стандарта про UB. А треды использовались Qtшные и коллега возражал, что так как это не стандартные треды и примитивы синхронизации, то эти цитаты из Стандарта не эпплаятся
При чём здесь qt-шные треды? Во-первых они реализованы на тех же примитивах ОС, во вторых - вопрос здесь в семантике volatile, а не тредов )

Alex
19.09.2018
17:28:43

Denis
19.09.2018
17:28:53

Max
19.09.2018
17:29:00

Anton
19.09.2018
17:29:03
или уже нет? )

Antony
19.09.2018
17:29:12

39170
19.09.2018
17:29:28

Google

Anton
19.09.2018
17:29:56

39170
19.09.2018
17:30:08

Anton
19.09.2018
17:30:11
но вообще без надобности нехорошо так писать в любом случае

Firstname
19.09.2018
17:30:27
я сдаюсь....

Alex
19.09.2018
17:30:35

Firstname
19.09.2018
17:30:36
переписал на smart pointer

Alex Фэils?︙
19.09.2018
17:30:38

Firstname
19.09.2018
17:30:43
можете поревьюить код?

Alex
19.09.2018
17:30:48
Аллокаторов жеж развелось)

Simon
19.09.2018
17:30:49

Alex Фэils?︙
19.09.2018
17:30:50

Firstname
19.09.2018
17:30:59
ну гитхаб есть

Alex
19.09.2018
17:30:59
И Даг Ли руку приложил, и МС, и Гугл

Firstname
19.09.2018
17:31:04
пастбин не осилю

39170
19.09.2018
17:31:41

Firstname
19.09.2018
17:32:01
https://github.com/Worsell/SomeSimpleProjects/tree/SimpleBinaryTree/scr/SimpleTree

Anton
19.09.2018
17:32:06

Firstname
19.09.2018
17:32:06
вот короче гитхаб

Anton
19.09.2018
17:32:14
volatile не делает никого атомиком в c++

Firstname
19.09.2018
17:32:17
есть такая проблема