@ProCxx

Страница 2360 из 2477
Anton
19.09.2018
16:57:36
lock-free вот это вот всё

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

Anton
19.09.2018
16:57:49
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 отношение

/dev
19.09.2018
16:59:07
почему?
Ни разу нет

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

/dev
19.09.2018
17:00:44
Antony
19.09.2018
17:01:30
если пометить volatile будут видны
Ну вот ни разу не правда: https://godbolt.org/z/qv__KG

Max
19.09.2018
17:01:44
если пометить volatile будут видны
.. и она всё равно не будет атомарной.

Alexander
19.09.2018
17:01:45
/dev
19.09.2018
17:01:49
если пометить volatile будут видны
volatile просто запретит оптимизировать чтение и запись в память, а что там уже в кешах процессора — не его дело

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
на каком-нибудь обрубке без кешей volatile, да, сделает своё дело
там ещё и регистров не должно быть, чтобы оно и правда работало

Ну вот ни разу не правда: 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
потому что volatile не добавляет такой семантики
Жаль, я бы от джавового волатайла в плюсах не отказался

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
я вот про такие простые вещи, если что
нет, не будет https://godbolt.org/z/RMAObJ разница в mfence/xchg (второй на x86 атомарен)

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

Anton
19.09.2018
17:15:10
Antony
19.09.2018
17:16:29
речь о ситуациях когда это не важно
ок теперь главный вопрос - ЗАЧЕМ так делать, если std::atomic - проще, переносимее и документирует поведение?

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

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

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

Alex
19.09.2018
17:18:43
на arm всё то же самое
PowerPC шлет тебе привет ?

Anton
19.09.2018
17:19:03
PowerPC шлет тебе привет ?
вот с этим я вообще не работал )) не знаю что там было раньше на маках

слишком молодой )

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

Anton
19.09.2018
17:19:32
Да консольки жеж
а, ну там вообще отдельный разговор ))

Да и сервера есть
IBM Power в серверах это немного не то

Antony
19.09.2018
17:19:59
на arm всё то же самое
на арм есть c++11

Anton
19.09.2018
17:20:13
на арм есть c++11
если тулчейн не при царе горохе собирали ;)

кароч, я не спорю, что 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
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
если вы на подобном arm будете пользоваться операционкой без вытесняющей многозадачночти, то может не замечать изменений крайне долго
ну там linux обычно, с вытесняющей многозадачностью, к тому же там внутри while надо как-нибудь разрешить переключение контекста обычно, sleep там какой-нибудь

Denis
19.09.2018
17:28:53
Max
19.09.2018
17:29:00
Тоже pthread?
на linux - да

Anton
19.09.2018
17:29:03
Тоже pthread?
ну на linux сложно представить что-то другое

или уже нет? )

39170
19.09.2018
17:29:28
Google
Anton
19.09.2018
17:29:56
да, но коллега использовал в качестве "примитива" только volatile bool
а можно код полностью, что оно там делать должно?

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
да, но коллега использовал в качестве "примитива" только volatile bool
это типа спор о том, делает ли волатайл атомиком?

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
есть такая проблема

Страница 2360 из 2477