powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какую библиотеку посоветуете с потокобезопасными контейнерами?
82 сообщений из 82, показаны все 4 страниц
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419356
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял в Qt и в Boost таких контейнеров не реализовано. Есть в Intel ТВВ, но я пока эту библиотеку не использовал.

Кто что использует?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419363
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Смотрели в boost::lockfree?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419365
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Ещё можете глянуть на libcds , её разрабатывает один местный дядька уже давно. Был пару раз на его стэндапах, вроде своё дело знает, хотя некоторые из его высказываний вогнали меня в ступор...
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419374
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZ хотя некоторые из его высказываний вогнали меня в ступор...
Например?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419424
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНасколько я понял в Qt и в Boost таких контейнеров не реализовано. Есть в Intel ТВВ, но я пока эту библиотеку не использовал.

Кто что использует?
в последнее время всё чаще free-lock выходит из гик-сообщества, но до продакшена ещё далеко

на мой взгляд лучше не ходить туда, пока свой контейнер не напишешь (хотя бы стэк, очередь) и по всем граблям не пройдёшь
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419449
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинNekZ хотя некоторые из его высказываний вогнали меня в ступор...
Например?
Например, что не нужно математически доказывать корректность алгоритма -- нужно его обложить кучей грубых и нагрузочных тестов в продакшне. Типа "ну а мне-то чо, что доказано? Главное чтобы работало стабильно"
Или его подход к проектированию кода -- прямо на стэндапе показывал как подпирает свой код костылями (ещё и в виде макросов). Может, это был и единственный вариант, но показывать такое публике я бы не стал, так как у опытных пользователей C++ сразу в подсознании вспыхивает "TRIGGERED! Monkey code detected!".

В общем и целом, у меня сложилось впечатление, что они пишут софт чисто под своё железо и не задумываются о масштабируемости и переносимости на другие конфигурации.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419456
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)в последнее время всё чаще free-lock выходит из гик-сообщества, но до продакшена ещё далеко

на мой взгляд лучше не ходить туда, пока свой контейнер не напишешь (хотя бы стэк, очередь) и по всем граблям не пройдёшь

Прочитал книжки "Практическое программирование на С++ " (Боровский) и "Параллельное программирование на С++ в действии" (Уильямс). В книгах даны разные примеры очередей без блокировок, которые не факт, что будут качественно работать в промышленных масштабах.

В результате пришел к выводу, что на самостоятельную реализацию и тестирование у меня уйдет много времени, которого очень жаль. Основные проблемы возникающие при многопоточном программировании и так понятны. Да и зачем изобретать велосипед, если возможно уже есть протестированные и даже оптимизированные по производительности решения?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419458
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZAlekseySQL,

Смотрели в boost::lockfree?

Спасибо! Мне как раз очередь нужна для передачи сообщений от дочерних потоков родительскому, чтобы быть в курсе процесса работы.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419459
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

В догонку видео с разработчиком TBB:
YouTube Video
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419494
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

а готов?

я вот думаю, что прежде чем садиться за гоночный болид надо бы немного "подтянуться и поднатаскаться" на чём ни будь попроще
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419642
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)я вот думаю, что прежде чем садиться за гоночный болид надо бы немного "подтянуться и поднатаскаться" на чём ни будь попроще

Нет, вы предлагаете собрать болид своими руками. Во время сборки болида вы начнете утверждать, что надо разобраться в изготовлении деталей и сделать их также самостоятельно. Когда будете делать детали, то вам придет гениальная мысль, что надо бы научиться выплавлять металл (а то не спортивно как-то!). При реализации последнего вам захочется заняться геологоразведкой и примерно тут вы помрете от старости так ничего и не сделав за всю жизнь.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419663
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

ох люблю молодых прытких

вот вам потренироваться на кошках , у Dima T там очередь и пул акторов, которые можно заменить на free-lock вариант.
Он утвердает что будет медленнее, дакажете обратное?

вот его проектик:
https://github.com/Dmitriy-GH/lite_thread
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419689
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНет, вы предлагаете собрать болид своими руками. Во время сборки болида вы начнете утверждать, что надо разобраться в изготовлении деталей и сделать их также самостоятельно. Когда будете делать детали, то вам придет гениальная мысль, что надо бы научиться выплавлять металл (а то не спортивно как-то!). При реализации последнего вам захочется заняться геологоразведкой и примерно тут вы помрете от старости так ничего и не сделав за всю жизнь.
Ну вообще, это правильный подход. Хочешь управлять гоночным болидом в совершенстве, не вылетев на первом же повороте -- тебе нужно знать как функционирует каждая деталь и из чего она сделана.
Раз уж вы читали Уильямса, то должны понимать это.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419699
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, подскажите есть ли пулы потоков с установкой приоритета потока? В бустовском thread_group, кьютовском QThreadPool и даже в стандартных Thread от не нашел.

Неужели нет пулов, где можно указать приоритет?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419763
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZВася Уткинпропущено...

Например?
Например, что не нужно математически доказывать корректность алгоритма -- нужно его обложить кучей грубых и нагрузочных тестов в продакшне. Типа "ну а мне-то чо, что доказано? Главное чтобы работало стабильно"
Или его подход к проектированию кода -- прямо на стэндапе показывал как подпирает свой код костылями (ещё и в виде макросов). Может, это был и единственный вариант, но показывать такое публике я бы не стал, так как у опытных пользователей C++ сразу в подсознании вспыхивает "TRIGGERED! Monkey code detected!".

В общем и целом, у меня сложилось впечатление, что они пишут софт чисто под своё железо и не задумываются о масштабируемости и переносимости на другие конфигурации.
Я думаю на конференции/стендапе понятно доказать корректность даже части libcds не успеешь, в то же время доказательства есть в куче научных работ откуда он набрал большинство алгоритмов. А понятно объяснить как доказывать корректность собственных wait/lock-free алгоритмов - это целую книгу писать.
Я понимаю что такое схематически доказать корректность многопоточного алгоритма в терминах std::memory_order и построить дерево событий, но что такое - доказать математически ?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39419784
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинЯ понимаю что такое схематически доказать корректность многопоточного алгоритма в терминах std::memory_order и построить дерево событий, но что такое - доказать математически ?
Здесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма .
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420016
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZЗдесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма .
Лучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора.
Платят за программу - значит правильный алгоритм.
А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный )))
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420051
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Я лично очень сомневаюсь, что тебе нужны потокобезопасные контейнеры.
Ну и "потокобезопасный" -- понятие растяжимое, там по каждой операции
есть описание, какие гарантии безопасности в разных потоках даются.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420079
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНарод, подскажите есть ли пулы потоков с установкой приоритета потока? В бустовском thread_group, кьютовском QThreadPool и даже в стандартных Thread от не нашел.

Неужели нет пулов, где можно указать приоритет?

Нет, нету.
Но ты можешь поставить приоритеты используя непереносимые средства конкретной OC.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420244
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Тогда решил делать свой менеджер с Qt- потоками (у которых есть возможность задать приоритет).
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420264
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вот вам потренироваться на кошках , у Dima T там очередь и пул акторов, которые можно заменить на free-lock вариант.
Он утвердает что будет медленнее, дакажете обратное?
Не надо перевирать то, что не понял. Я там говорил две несвязные меж собой мысли:
1. Я не хочу переделывать очередь с критических секций на lock-free, т.к. сам я такое написать не смогу. Написал как смог.
2. В другом месте у меня уже lock-free, но надо обойтись вообще без пересечений потоков, без доступа всех потоков в одну точку памяти. Без блокировки быстрее чем с блокировкой, неважно lock-free, мутексы и т.д. lock-free не бесплатен.

Ты скрестил первое со вторым и дальше по форуму разносишь. Зачем?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420269
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZiv,

Тогда решил делать свой менеджер с Qt- потоками (у которых есть возможность задать приоритет).
Подумай еще зачем тебе это надо. Если ты не видишь другого решения - это не значит что его нет.

Приоритеты очень опасная штука, стрелять в ногу с ними элементарно, скорее всего поэтому их нет. Например запустится твоя прога создаст приоритетных потоков столько сколько ядер и начнет в них молотить долго и упорно, а у юзера в соседнем окне браузер колом встанет ... Подумай еще.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420380
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyNekZЗдесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма .
Лучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора.
Платят за программу - значит правильный алгоритм.
А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный )))
Поэтому я и ушёл из IT ;-)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420421
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЛучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора.
Платят за программу - значит правильный алгоритм.
А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный )))А если правильный, но opensource/freeware?
Да и за сам алгоритм обычно ничего никогда не платят, платят за программу, которая позволяет удобно этим алгоритмом пользоваться. Чем удобнее программа, тем приятнее платят.
Пример: Windows SDK(free, pure) vs MS Visual Studio(pay, handy) (да, удобство студии субъективно, но только по сравнению с другими IDE, а по сравнению с SDK оно очевидно)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420441
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПриоритеты очень опасная штука, стрелять в ногу с ними элементарно, скорее всего поэтому их нет. Например запустится твоя прога создаст приоритетных потоков столько сколько ядер и начнет в них молотить долго и упорно, а у юзера в соседнем окне браузер колом встанет ... Подумай еще.

Я наоборот хочу поставить очень низкий приоритет своим потокам. Таким образом мне удастся запустить 4 дочерних потока (по количеству ядер) + основной поток для показа текущих сообщений из дочерних. Причем в этом случае основной поток не будет тормозить, потому что у него относительно дочерних потоков будет высокий приоритет и в тоже время ядро не будет простаивать между показами информации о ходе работы.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420469
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ наоборот хочу поставить очень низкий приоритет своим потокам. Таким образом мне удастся запустить 4 дочерних потока (по количеству ядер) + основной поток для показа текущих сообщений из дочерних. Причем в этом случае основной поток не будет тормозить, потому что у него относительно дочерних потоков будет высокий приоритет и в тоже время ядро не будет простаивать между показами информации о ходе работы.
Средствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить.
Для виндовса GetCurrentThread() и SetThreadPriority()
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420668
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА если правильный, но opensource/freeware?
Вы думаете за это не платят? Думаете, миллионы строк кода в ядре линукса написаны людьми которые не получают зарплату, просто как хобби?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420851
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
я тот самый дядька, который гонит пургу на стендапах :-) Не мог пройти мимо

NekZНапример, что не нужно математически доказывать корректность алгоритма -- нужно его обложить кучей грубых и нагрузочных тестов в продакшне. Типа "ну а мне-то чо, что доказано? Главное чтобы работало стабильно"


Это довольно серьезный вопрос. Дело в том, что описание и доказательство работоспособности алгоритма обычно дается в независимом от языка реализации виде и поэтому - в предположении sequential consistent модели памяти. Думаю, SQ - это не то, что Вы хотели бы видеть у себя в программе. Работ, посвященных анализу конкурентных алгоритмов именно в модели памяти C++, немного (справедливости ради надо сказать, что их появляется все больше), и в основном они касаются простейших алгоритмов с двумя - тремя атомарными переменными. В случае алгоритмов с бОльшим числом взаимодействующих атомарных переменных анализ весьма затруднен. Инструментов для анализа довольно мало (я имею в виду открытых, open source) - кроме Thread Sanitizer, пожалуй, ничего и нет. Выхлоп, который дает TSan, довольно часто ставит меня в тупик...

Есть ещё relacy Дмитрию Вьюкова, - пожалуй, наиболее продвинутый (по заложенной идее) на сегодня инструмент, жаль, что он не доведен до конца (хотелось бы инструментации кода в стиле санитайзеров).

Вообще, я скажу крамольную вещь, - модель памяти C++ так, как она описана в стандарте, нежизнеспособна. Это набор аксиом, весьма слабо коррелирующих с реальным положением дел в hardware. Это мое сугубое ИМХО, но оно косвенно подтверждается, например, нежеланием разработчиков Linux переходить на модель памяти C++11 (как Вы помните, модель памяти C++11 также распространяется на C11), и это нежелание они (Linux developers) весьма неплохо аргументируют.

NekZИли его подход к проектированию кода -- прямо на стэндапе показывал как подпирает свой код костылями (ещё и в виде макросов)
Видимо, на одном из выступлений я забыл произнести сакральную фразу про то, что "lock-free алгоритмы настолько многословны, что не вмещаются на страницу презентации, поэтому здесь я нагадил применил макросы". Я тоже не любитель макромагии, подтверждением чему может быть исходный код libcds в первозданном, так сказать, виде.
Ну и насчет костылей. Вы не поверите, пока не прочтете первоисточники, - половина lock-free кода - это именно костыли. Костыли для того, чтобы любое промежуточное состояние контейнера в процессе вставки/удаления элемента было персистентным. Поэтому я предпочитаю термин "трюки" ;-) Костыль - это кеши процессора.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39420952
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxВообще, я скажу крамольную вещь, - модель памяти C++ так, как она описана в стандарте, нежизнеспособна. Это набор аксиом, весьма слабо коррелирующих с реальным положением дел в hardware. Это мое сугубое ИМХО, но оно косвенно подтверждается, например, нежеланием разработчиков Linux переходить на модель памяти C++11 (как Вы помните, модель памяти C++11 также распространяется на C11), и это нежелание они (Linux developers) весьма неплохо аргументируют.
А есть ссылка на эти аргументы? И есть ли где-то кросс-процессорная модель памяти, которая лучше?
Помимо memory_order_cunsume - кандидата на depricated, и не использования всех возможностей LL/SC - явных косяков не вижу.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421001
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, ссылки есть, например, одно из последних: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0124r1.html
Вообще, у Paul McKenney много об этом.
Но разговор идет не о том, что лучше/хуже, а о том, что они (модели памяти) различны. Ядро Линукса использует более "старую" модель (read/write barriers), которая возникла как раз из железа и зачастую более понятна в применении.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421081
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСредствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить.
Для виндовса GetCurrentThread() и SetThreadPriority()

Спасибо, обдумаю ваше предложение.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421125
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВы думаете за это не платят? Думаете, миллионы строк кода в ядре линукса написаны людьми которые не получают зарплату, просто как хобби? я не знаю. Но если тут проскочило слово "зарплата", значит кто-то кому-то платит зарплату с доходов этого opensourse/freeware, вопрос в том, как этот кто-то этот доход получает. Я, конечно, новичок во всех этих коммерческих операциях, но мне кажется, что free vs pay отличается только тем, что в начале, "деньги" или "стулья", если сначала стулья (раздаём ядро бесплатно, делает сопровождение/консультации/доработки/да просто берём трубку телефона - за деньги), то есть вполне ощутимый шанс остаться без денег, особенно если ты никому не известный разработчик, даже если супер-гениальный. Если я не прав, то мне бы сильно хотелось узнать, как можно заработать на freeware одинокому девелоперу, я этой темой давно интересуюсь.
khizmaxВообще, я скажу крамольную вещь, - модель памяти C++ так, как она описана в стандарте, нежизнеспособнаа можно небольшой экскурс по теме, как оно устроено, и почему оно плохо?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421154
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbмне бы сильно хотелось узнать, как можно заработать на freeware одинокому девелоперу, я этой темой давно интересуюсь.
Там заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421224
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khizmaxПривет,
я тот самый дядька, который гонит пургу на стендапах :-)

Это хорошо, что ты к нам пришёл, я очень рад.

Мне очень понравился твой доклад в первой трети, в связи со здоровым желанием выработать правильный подход к разработке многозадачного кода.
Я целиком это поддерживаю, потому что уж очень много сейчас разрабов, желающих запустить 2000 потоков на любой чих...

Остальное пока не смотрел, встал на моделях многопоточной/задачной обработки, -- тоже интересно!
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421235
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСредствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить.
Для виндовса GetCurrentThread() и SetThreadPriority()

Я сижу под Linux и тут инет говорит, что приоритет меняется специальной структурой у объекта pthread_t. Такого объекта у меня нет, если все делать средствами qt.

Как находясь в методе run изменить приоритет в Linux?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421247
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не силен в линуксах. Гугл в помощь .
Немного почитал, как понимаю там еще права замешаны, снизить вроде сможешь, а обратно повысить только с правами суперпользователя (root, sudo), т.е. если твоя прога будет без прав, то никаким способом не повысит обратно. Только поток завершать.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421305
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТам заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время.покажите мне хоть одного такого разработчика. Шароварщиков я много видел, работающих по одному. Но вот ни одного фриварщика с деньгами не видел. Там должен быть адовый порог входа, чтобы себе такой имидж в одиночку сделать и не быть задавленным более крупными командами, тем более если это опенсорс.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421344
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMbа можно небольшой экскурс по теме, как оно устроено, и почему оно плохо?

уфф, вкратце так и не опишешь... Это тема для хорошего застолья с пивом на весь вечер. Ниже - мое ИМХО.
Я впервые услышал и увлекся lock-free структурами данных в 2006 году, то есть почти одновременно с началом дискуссии об atomic в C++11. Тогда (где-то 2008-2010 года) было несколько подходов к atomic и несколько жарких дискуссий в политкорректной форме, все документы есть на wg21 . Победил Hans Boehm и его подход.
Так как в то время C++11 ещё не было, приходилось писать свои atomic-велосипеды и, соотвественно, изучать модели памяти различных архитектур (честно скажу - от тех времен в голове мало что осталось). Причем весьма полезной была инсайдерская инфа от разработчиков того или иного процессора с различных форумов.

В стандарте модель памяти C++11 описана в терминах ячеек памяти, и memory order применяется тоже к ячейкам памяти. То есть если есть два различных адреса A и B, то, по стандарту, memory ordering, примененный к A и к B, никак не связаны. Отсюда вытекают некоторые подозрительные вещи: например, чтобы удовлетворить стандарту, предлагается вводить ненужные атомарные переменные с довольно тяжелыми операциями atomic fetch_add и memory_order_acq_rel ( вот разбор схемы Hazard Pointer в терминах C++11 memory model). Но реально memory order - это барьеры, на всех современных архитектурах они не применяются с конкретным адресам памяти, - они глобальны. На ассемблере барьер - это отдельная инструкция .
Часто возражают - а вот Intel Itanium, у него load/store с явным указанием acq/rel-семантики в одной инструкции, то есть тут барьер явно привязан к конкретному адресу, что и постулирует стандарт. Но если почитать спеку Intel Itanium по его модели памяти, то там часто путаница - в одном месте cказано, что memory ordering применяется к адресу, в другом - про адреса вообще ни слова. И самое главное - по инфе от разработчиков Итаниума, внутри все эти acq/rel-полубарьеры для load/store - это обычный mfence, то есть полный барьер, не связанный с адресом!
А теперь немного конспирологии ;-) Родителем memory model C++11 является, насколько я понимаю, Hans Boehm, - умный мужик ученый (любимое число - 42 ;), который на момент разработки стандарта работал... в лабораториях HP ! А кто такая HP? Это главный пропагандист архитектуры Itanium. А у Itanium load/store с явным указанием семантики acq/rel, - то, что мы сегодня видим в atomic load/store C++11.

Что ещё мне не нравится в стандарте - то, что memory order явно связан с потоками (threads). Да, несомненно, модель памяти предназначена именно для multithread. Но попытка каким-то образом связать load.acq одного потока с store.rel другого - это запутывание читателя! Один поток никак не может влиять на видимость значений в другом; часто пишут "поток A записал в M значение 42, но поток B не увидит 42 в M, пока/если..." и т.д. Все это чушь полная! Вернее, это производное рассуждение от истинной проблемы. Видимостью мы управлять вообще не можем. У современных процессоров кеши когерентные, так что "A записал, а B не увидел" - с точки зрения кеша такого быть не может. Но вот порядок/order , в котором B увидит то, что записал A, может быть другим. И виноват в этом не кеш, а небольшой костыль в виде store buffer между каждым ядром процессора и L1 кешем. Порядком мы управлять можем - это называется memory fence/barrier. И это отдельная инструкция, а не довесок/флаг в виде memory order к atomic load/store.

У меня большое подозрение, что C++11 memory model писалась исключительно для реализации spin lock. Но в конкурентных контейнерах применяются такие изощренные схемы, которым существующий memory ordering мал. Например, частый трюк при построении алгоритма конкурентного self-balanced дерева: операция поиска find() - неблокируемая, операции insert/erase - применяется fine grained locks на уровне узлов. То есть это схема single producer (только один поток может делать вращения) - multiple consumer (много потоков могут ходить по дереву, в том числе и по тем ветвям, которые в данный момент вращаются). При вращениях, особенно двойных, очень важен порядок, в котором указатели на узлы дерева (они, конечно же, atomic) модифицируются, иначе find()-потоки залезут не туда. Вопрос: какой тут должен быть memory ordering для чтения и записи node ptr?.. По сути, здесь достаточно store/store барьера во вращениях между каждым изменением указателя на узлы, то есть только в producer'е, чтобы задать порядок, в котором consumer'ы должны увидеть модифицируемые узлы поддерева. Как выразить это в C++11 memory model?..
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421402
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbDima TТам заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время.покажите мне хоть одного такого разработчика.
Nginx . Думаю у разработчика оплачиваемой работы хватает. Но таких единицы, кто в одиночку что-то массовое создал.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421445
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, мужик, не хотел чтобы что-то грубо прозвучало про твои выступления, просто прими ожидаемую реакцию/критику публики со стендапов.
khizmaxУ современных процессоров кеши когерентные, так что "A записал, а B не увидел" - с точки зрения кеша такого быть не может. Но вот порядок/order , в котором B увидит то, что записал A, может быть другим. И виноват в этом не кеш, а небольшой костыль в виде store buffer между каждым ядром процессора и L1 кешем.

А разве не было заявлено много раз про то, что разные потоки, могут выполняться на разных процессорах , что будет триггерить перебрасывание кэшей между процессорами, что является серьёзным оверкиллом?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421454
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZ,

Несомненно, было заявлено, но при этом когерентность кешей разных процессоров никто не отменяет. Именно поэтому в многопроцессорных системах так тормозит обращение к данным "чужого" процессора.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421495
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khizmaxNekZ,

Несомненно, было заявлено, но при этом когерентность кешей разных процессоров никто не отменяет. Именно поэтому в многопроцессорных системах так тормозит обращение к данным "чужого" процессора.
приветствую

как-то довольно печальненько однако

простой интерлок переменной у меня на i7 упирается в 40 млн операц./c, с 150 млн./с на 1-м
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421677
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmax , Но помимо привязки к процессору, модель памяти должна была быть привязана к компилятору, поэтому memory_order одновременно барьеры и для процессора и для компилятора.

Здесь есть как минимум 3 преимущества привязки барьеров к операциям:
1. Не все барьеры подходят для всех операций, для store (не подходят consume, acquire, acq_rel), а для load (не подходят release, acq_rel), и компилятор выдаёт compile-time ошибку. Этого он не может сделать для барьеров оторванных от операций.
2. Для компилятора, помимо изменения порядка - это ещё и управление spilling/filling всеми, в том числе неатомарными переменными.
3. Если процессоры делятся weak и strong модели памяти, то компилятор изначально всегда weak - и это даёт ему огромные возможности для оптимизаций. Барьеры не привязанные к операциям закрывают для переупорядочивания целые направления для всех операций, а не только для некоторых.

Насчет оптимизаций компилятора, допустим, у меня есть код (здесь Store-Load последовательность, которая без seq_cst могла бы переупорядочиваться):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    c.store(4, std::memory_order_relaxed);          // movl 4,[c];
    int tmp = b.load(std::memory_order_seq_cst);    // movl ,[tmp];
}


Я хочу дать возможность компилятору двигать c.store() в любую сторону: до a.store() или после b.load() - это даст компилятору больше манёвров для оптимизации. И в данном случае компилятор это сделать может.

Теперь перепишу этот код, как если бы мы делали с барьерами памяти отделенными от операций (для корректности оставлю переменные атомарными но всегда в них буду использовать самую слабую relaxed):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_relaxed);                 // movl 2,[a]; 
    std::atomic_thread_fence(std::memory_order_seq_cst);   // mfence - (1) here?
    c.store(4, std::memory_order_relaxed);                 // movl 4,[c];
    //std::atomic_thread_fence(std::memory_order_seq_cst);   // mfence - (2) or here?
    int tmp = b.load(std::memory_order_relaxed);           // movl [b],[tmp];
}



В какой бы из 2-ух позиций я не вставил atomic_thread_fence( memory_order_seq_cst ) - это всегда закрывает как минимум одно направление для оптимизации. Компилятор не может понять к какой операции относится atomic_thread_fence-барьер, и какую операцию можно перемещать свободно, а какую нет.

khizmaxВ стандарте модель памяти C++11 описана в терминах ячеек памяти, и memory order применяется тоже к ячейкам памяти. То есть [b]если есть два различных адреса A и B, то, по стандарту, memory ordering, примененный к A и к B, никак не связаны
. Отсюда вытекают некоторые подозрительные вещи: например, чтобы удовлетворить стандарту, предлагается вводить ненужные атомарные переменные с довольно тяжелыми операциями atomic fetch_add и memory_order_acq_rel

А что имеется ввиду под выделенным?

Например, если мы применим seq_cst к store(A) и последующем load(B), то гарантировано будет предотвращено Store-Load-переупорядочивание только для этих двух операций, и ни для каких больше.

Следующий код (между c.store() и b.load() может не генерироваться mfence, про исключения вы наверное знаете):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    c.store(4, std::memory_order_release);          // movl 4,[c];
    int tmp = b.load(std::memory_order_seq_cst);    // movl [b],[tmp];
}



На всех типичных компиляторах x86_64 может быть пере-упорядочен так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    int tmp = b.load(std::memory_order_seq_cst);    // movl [b],[tmp];
    c.store(4, std::memory_order_release);          // movl 4,[c];
}



c.store(rel); b.load(seq); могут быть переупорядочены в b.load(seq); c.store(rel);

Мало того, на других компиляторах или процессорах могут быть и другие изменения порядка:
a.storeA(seq_cst); c.load(acq_rel); может быть переупорядочен в c.load(acq_rel); a.store(seq_cst);
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421781
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткин, я ждал этого вопроса, про оптимизации компилятора ;-) Вы уже все сами ответили - да, барьеры также являются и барьерами компилятора. Полагаю, C++11 memory model для компиляторов был головной болью, ибо запрещал практически все оптимизации (речь, конечно, об atomic), - все они рассчитаны на один поток. Например, GCC, объявив GCC-4.8 "C++11 ready", только к GCC-6 восстановил большую часть оптимизаций (это мое наблюдение и найденные обмолвки/слухи/тесты в инете, пруфа не дам).
Но почему они (барьеры) должны быть обязательно прикреплены к atomic load/store/RMW?..
load(acquire) - это

load x
membar LoadLoad | LoadStore

store( release ) - это

membar LoadStore | StoreStore
store x

Вот вам явные (полу)барьеры с relaxed load/store. Они же - барьеры компилятора (они же - ассемблер Sparc; пожалуй, у Sparc была наиболее прямая memory model, без излишеств, но которая позволяла всё).
Это та модель, которая применялась до C++11, которая применяется сейчас в ядре Linux и которая прямо вытекает из железа.
И здесь барьеры не привязаны к ячейкам памяти, которые читаются/пишутся. Это просто явное указание упорядочения load/store.
Именно это я и "имел в виду под выделенным" - барьер не привязан явно к адресу. Если вы внимательно прочтете ту ссылку, которую я давал, не весь документ, а часть про Hazard Pointer, - увидите: там ради удовлетворения стандарта (которого на момент написания ещё не было, но он активно обсуждался) вводится ненужная для HP атомарная переменная, через которую синхронизируются потоки с помощью RMW. И все потому, что в HP atomic.load(A, acquire) и тут же atomic.store(B, release) - два разных адреса, а два разных адреса по C++11 не синхронизируются.

В общем, чем больше я работаю с atomic/memory ordering, - тем больше у меня вопросов. Maybe, это потому, что в свое время я начитался запрещенной литературы мануалов по различным архитектурам (кстати, могу сказать, - по большей части многотомное и бесполезное чтиво, только запутывает, начинаешь с подозрением относится даже к регистровым операциям).
Мне все больше кажется, что C++11 memory model - это лишь первая итерация, ещё далекая до идеала. И я рад, что нашлись линуксоиды-ядерщики, которые задают комитету похожие вопросы, - значит, дискуссия продолжится и решение будет найдено.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421846
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxПолагаю, C++11 memory model для компиляторов был головной болью, ибо запрещал практически все оптимизации (речь, конечно, об atomic) , - все они рассчитаны на один поток. Например, GCC, объявив GCC-4.8 "C++11 ready", только к GCC-6 восстановил большую часть оптимизаций (это мое наблюдение и найденные обмолвки/слухи/тесты в инете, пруфа не дам).
Строго говоря, C++11 memory model не запрещает все оптимизации, мало того она запрещает оптимизаций значительно меньше, чем запрещают атомарные операции применяемые в ядре Linux. А то, что конкретно старые версии GCC 4.8 - 6.0 не умели оптимизировать C++11 memory model - это проблема недоделанного компилятора. А в clang или icc с этим все заметно лучше.

khizmax вводится ненужная для HP атомарная переменная, через которую синхронизируются потоки с помощью RMW. И все потому, что в HP atomic.load(A, acquire) и тут же atomic.store(B, release) - два разных адреса, а два разных адреса по C++11 не синхронизируются.
Не понял про какое именно место в Hazard Pointer вы говорите. Но если покажите конкретную строчку(и) кода в PDF или у вас в libcds - смогу что-либо конкретное ответить.


Вот в таком коде стандарт C++11 может переместить c.store() как до a.store(), так и после b.load().
Мало того, даже скомпилированный код может быть переупорядочен процессором подобным образом:
c.store(relaxed) <-> b.load(seq_cst) на x86_64: https://godbolt.org/g/Tft2vw
a.store(seq_cst) <-> c.store(relaxed) на PowerPC: https://godbolt.org/g/oZGB4x

Вы, например, как бы переписали данный код с барьерами не привязанными к операциям?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    c.store(4, std::memory_order_relaxed);          // movl 4,[c];
    int tmp = b.load(std::memory_order_seq_cst);    // movl [b],[tmp];
}
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39421900
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправил:
Вася Уткин a.store(seq_cst) <-> c.load(relaxed) c.store(relaxed) на PowerPC: https://godbolt.org/g/oZGB4x
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422115
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZAlekseySQL,

Смотрели в boost::lockfree?

Посмотрел, и разочаровался: у очереди один метод push, который Not Thread-safe ( http://www.boost.org/doc/libs/1_63_0/doc/html/boost/lockfree/queue.html). У меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток).
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422117
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПосмотрел, и разочаровался: у очереди один метод push, который Not Thread-safe ( http://www.boost.org/doc/libs/1_63_0/doc/html/boost/lockfree/queue.html). У меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток).
Странно, а по ссылке, что вы привели, написано, что он Thread-safe
Вообще было бы странно если бы операции модификации очереди, которая по дизайну потокобезопасна, вдруг оказались недопустимы в потоках )))
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422121
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинНасчет оптимизаций компилятора, допустим, у меня есть код (здесь Store-Load последовательность, которая без seq_cst могла бы переупорядочиваться):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    c.store(4, std::memory_order_relaxed);          // movl 4,[c];
    int tmp = b.load(std::memory_order_seq_cst);    // movl [b],[tmp];
}



Я хочу дать возможность компилятору двигать c.store() в любую сторону: до a.store() или после b.load() - это даст компилятору больше манёвров для оптимизации. И в данном случае компилятор это сделать может.

Странно, я всегда думал что через load/store совмещенный с seq_cst компилятору нельзя двигать операции в обе стороны (так же как и через release/acquire в одну сторону), иначе например мьютекс не будет работать.
Т.е. мое понимание было что load/store эквивалентно неатомарным операциям + отдельный барьер.
И весь спор про разницу моделей С++ и линукса ни о чем кроме синтаксиса.
Нет?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422157
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинНасчет оптимизаций компилятора, допустим, у меня есть код (здесь Store-Load последовательность, которая без seq_cst могла бы переупорядочиваться):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; mfence;
    c.store(4, std::memory_order_relaxed);          // movl 4,[c];
    int tmp = b.load(std::memory_order_seq_cst);    // movl ,[tmp];
}



Я хочу дать возможность компилятору двигать c.store() в любую сторону: до a.store() или после b.load() - это даст компилятору больше манёвров для оптимизации. И в данном случае компилятор это сделать может.

Странно, я всегда думал что [b]через load/store совмещенный с seq_cst компилятору нельзя двигать операции в обе стороны
(так же как и через release/acquire в одну сторону), иначе например мьютекс не будет работать.
Т.е. мое понимание было что load/store эквивалентно неатомарным операциям + отдельный барьер.
И весь спор про разницу моделей С++ и линукса ни о чем кроме синтаксиса.
Нет?
Выделенное не верно, в стандарте написано по другому, но запутанно, и вы его читали, а раз не поняли - поэтому зайду с другой стороны.
Я покажу во что компилятор компилирует load/store совмещенный с seq_cst, и покажу какие переупорядочивания он оставляет процессору.
А раз компилятор оставляет возможность таких переупорядочиваний процессору, значит и сам компилятор может делать эти же переупорядочивания .

Я покажу, как в этом коде процессор может переместить c.sotre(relaxed) как до a.store(seq_cst), так и после b.load(seq_cst):


1. Посмотрим что возможно на уровне asm-инструкций : https://en.wikipedia.org/wiki/Memory_ordering#In_symmetric_multiprocessing_.28SMP.29_microprocessor_systems
* x86_64 - strong memory model - allows Store-Load reordering (if there is no MFENCE) - правильно?
* PowerPC - weak memory model - allows Store-Store reordering (if there is no SYNC) - правильно?

2. Теперь посмотрим во что GCC компилирует "load/store совмещенный с seq_cst":
* x86_64 - может переупорядочить Store-Load т.к. между ними нет MFENCE:


* PowerPC - может переупорядочить Store-Store т.к. между ними нет sync:


В итоге получается, что один и тот же код скомпилированный под разные платформы может иметь одно из двух переупорядочиваний:
c.store(relaxed) <-> b.load(seq_cst) на x86_64: https://godbolt.org/g/Tft2vw
a.store(seq_cst) <-> c.store(relaxed) на PowerPC: https://godbolt.org/g/BTQBr8


Мало того, теоретически, но обычно не используют в компиляторах, семантика seq_cst может иметь 4 реализации на x86_64:

1. LOAD (without fence) and STORE + MFENCE
2. LOAD (without fence) and LOCK XCHG
3. MFENCE + LOAD and STORE (without fence)
4. LOCK XADD ( 0 ) and STORE (without fence)

Где 1 - это в GCC, 2 - это Clang & MSVC - по сути одно и тоже, очищает Store-Buffer после STORE
А 3 и 4 - не используют в компиляторах - очищают Store-Buffer перед LOAD

Так вот если бы некий компилятор использовал 3 и 4 реализацию seq_cst на x86_64, то была бы возможность переупорядочивания:
a.store(seq_cst) <--> c.load(relaxed)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <atomic>

// Atomic load-store
void test() {
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // movl 2,[a]; 
    int tmp1 = c.load(std::memory_order_relaxed);          // movl [c],[tmp1];
    int tmp = b.load(std::memory_order_seq_cst);    // mfence; movl [b],[tmp];
}
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422160
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ссылка на 4 возможных реализации seq_cst на x86_64: http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422167
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И первая картинка там не release, а relaxed для c.store():
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422196
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLУ меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток).
Во время разбирательства с акторами заметил такой момент: скорость заметно падает (в разы) когда все потоки начинают активно менять один и тот же участок памяти. У тебя это хвост очереди. И lock-free тут не панацея.

ИМХО Тут архитектуру надо менять: каждый пишет в свою очередь, а читатель читает все очереди. Тогда писатели друг-другу мешать не будут. Затести.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422206
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь ZeroMQ поизучать, это либа сообщения гонять, можно по сети, можно межпоточно (просто указатели передаются). Соединение из двух сокетов ZMQ_PAIR это и будет очередь, а для ожидания нескольких сокетов есть zmq_poll()
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422270
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВо время разбирательства с акторами заметил такой момент: скорость заметно падает (в разы) когда все потоки начинают активно менять один и тот же участок памяти. У тебя это хвост очереди. И lock-free тут не панацея.

ИМХО Тут архитектуру надо менять: каждый пишет в свою очередь, а читатель читает все очереди. Тогда писатели друг-другу мешать не будут. Затести.

Спасибо, думаю это будет самый простой вариант: тогда можно будет применить spsc_queue из lockfree (single-producer/single-consumer). У этой очереди push и pop "Thread-safe and wait-free" ( http://www.boost.org/doc/libs/1_63_0/doc/html/boost/lockfree/spsc_queue.html)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422271
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TМожешь ZeroMQ поизучать, это либа сообщения гонять, можно по сети, можно межпоточно (просто указатели передаются). Соединение из двух сокетов ZMQ_PAIR это и будет очередь, а для ожидания нескольких сокетов есть zmq_poll()

Спасибо, но думаю, что обойдусь очередями.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422331
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинА раз компилятор оставляет возможность таких переупорядочиваний процессору, значит и сам компилятор может делать эти же переупорядочивания.

Ну, я бы остерегся делать какие-либо выводы на основе реализации компиляторов.
Не говоря уже о том что отсутствие упорядочивания от компилятора не означает что процессор может переупорядочивать. Вполне возможно и другая причина - компилятор знает что проц. не будет переупорядочивать и поэтому не делает барьер.

Касательно вообще поднятого мной вопроса, то по всей видимости порядок гарантируется только среди доступов с seq_cst , а все что без него может передвигаться.
В этом случае непонятно как все работает ))
Все вот эти примеры с машинным кодом не слишком проясняют.
Позже еще почитаю и поэкспериментирую.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422352
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинА раз компилятор оставляет возможность таких переупорядочиваний процессору, значит и сам компилятор может делать эти же переупорядочивания.

Ну, я бы остерегся делать какие-либо выводы на основе реализации компиляторов.
Не говоря уже о том что отсутствие упорядочивания от компилятора не означает что процессор может переупорядочивать . Вполне возможно и другая причина - компилятор знает что проц. не будет переупорядочивать и поэтому не делает барьер.

Касательно вообще поднятого мной вопроса, то по всей видимости порядок гарантируется только среди доступов с seq_cst , а все что без него может передвигаться.
В этом случае непонятно как все работает ))
Все вот эти примеры с машинным кодом не слишком проясняют.
Позже еще почитаю и поэкспериментирую.
То что процессор точно может переупорядочивать - это я доказал.
Какой код генерирует GCC/Clang/MSVC/icc - можете посмотреть, а то что x86_64 может менять местами Store-Load без MFENCE между ними - это документация: Intel® 64 and IA-32 Architectures
автор8.2.3.4 Loads May Be Reordered with Earlier Stores to Different Locations

Ну а строго - именно так и написано в стандарте, но как я понял его никто не понимает, кроме тех кто писал
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422727
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткин,
Я согласен с вами, что указание порядка прямо с атомарной инструкцией, как это задано в C++11, может дать некие преимущества компилятору при оптимизации.
Правда, вот этот пример на PowerPC, про store/store reordering,

Вася Уткин* PowerPC - может переупорядочить Store-Store т.к. между ними нет sync:

меня несколько смущает: вроде бы общепринято, что для spin-lock достаточно acquire/release семантики: acquire RMW - вход в критическую секцию, release store - выход. Положим, что spin-lock защищает секцию, в которой мы только что-то сохраняем:
Код: plaintext
1.
2.
3.
4.
int x, y;
spin.lock()
x = 3;
y = 4;
spin.unlock()
Из вашего примера, где используется даже более сильный seq_cst store, получается, что на PowerPC (а раз это компилятор "пошалил", то можно полагать, - на любой архитектуре) все store (обычные, не atomic), могут просочиться вниз, за критическую секцию спин-лока?.. Или я чего-то не понял?..

Общее замечание: мне кажется, мы, по сути, говорим об одном и том же, только вы защищаете подход C++11, а я вижу в нем недостатки для практической работы. Большинство рассуждений сразу скатываются в atomic load/store с двумя, максимум тремя переменными. Алгоритмы lock-free структур данных работают часто с бОльшим числом атомарных переменных и не только с load/store, но и RMW (обычно CAS). Анализ правильности расстановки memory order в таких случаях весьма затруднен. Нужны инструменты (вы ведь, надеюсь, не полагаетесь только на аналитическое доказательство, что ваша программа не имеет утечек памяти, а применяете ещё и инструменты для поиска утечек, - asan и подобное). Да, C++11 допускает барьеры, не привязанные к переменным, - atomic_thread_fence, - но, например, TSan не инструментирует atomic_thread_fence, то есть просто не замечает его. Других удобных инструментов среди свободных я не знаю :-(
Я соглашусь с тем, что atomic_thread_fence дает меньше простора компилятору для оптимзации, - но разве это плохо?.. Особенно в такой тонкой области, как memory ordering...
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422744
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxВася Уткин,
Я согласен с вами, что указание порядка прямо с атомарной инструкцией, как это задано в C++11, может дать некие преимущества компилятору при оптимизации.
Правда, вот этот пример на PowerPC, про store/store reordering,

Вася Уткин* PowerPC - может переупорядочить Store-Store т.к. между ними нет sync:

меня несколько смущает: вроде бы общепринято, что для spin-lock достаточно acquire/release семантики: acquire RMW - вход в критическую секцию, release store - выход. Положим, что spin-lock защищает секцию, в которой мы только что-то сохраняем:
Код: plaintext
1.
2.
3.
4.
int x, y;
spin.lock()
x = 3;
y = 4;
spin.unlock()
Из вашего примера, где используется даже более сильный seq_cst store, получается, что на PowerPC (а раз это компилятор "пошалил", то можно полагать, - на любой архитектуре) все store (обычные, не atomic), могут просочиться вниз, за критическую секцию спин-лока?.. Или я чего-то не понял?..
Да, не поняли, но я описал очень строго.
1. Могут быть переупорядочены: store(seq), store(relaxed)
2. Не могут быть переупорядочены: store(relaxed), store(seq)
3. Компилятор не шалил, а выполнил строго то что описано в стандарте C++11 и мануалах PowerPC.
4. Не смотря на это, никакие инструкции Store или Load не могут выйти за пределы критической секции (пункт 2). Но множество Store могут войти в критическую секцию, если это выгодно процессору или компилятору (пункт 1).
5. Из пункт 4 - множество критических секций могут быть слиты в одну (acq - acquire, rel - release):
* было: load1(acq), code1, store1(rel), load2(acq), code2, store2(rel), load3(acq), code3, store3(rel)
* стало: load1(acq), load2(acq), load3(acq), code1, code2, code3, store1(rel), store2(rel), store3(rel)

Ещё раз схема - справедливость которой я утверждаю, такое переупорядочивание строго позволено стандартом C++11 и оно очень сильно оптимизирует программу.
1. Т.к. a.store(seq) расположен до c.store(relaxed), то они могут поменяться местами.
2. Если бы c.store(relaxed) стоял до a.store(seq), как это расположено в критической секции - то они не могли бы поменяться местами - sync стоит прям перед a.store(seq) : https://godbolt.org/g/BTQBr8


Ещё раз внимательнее посмотрите картинки со стрелочками - такое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать:





khizmaxОбщее замечание: мне кажется, мы, по сути, говорим об одном и том же, только вы защищаете подход C++11, а я вижу в нем недостатки для практической работы. Большинство рассуждений сразу скатываются в atomic load/store с двумя, максимум тремя переменными. Алгоритмы lock-free структур данных работают часто с бОльшим числом атомарных переменных и не только с load/store, но и RMW (обычно CAS). Анализ правильности расстановки memory order в таких случаях весьма затруднен. Нужны инструменты (вы ведь, надеюсь, не полагаетесь только на аналитическое доказательство, что ваша программа не имеет утечек памяти, а применяете ещё и инструменты для поиска утечек, - asan и подобное). Да, C++11 допускает барьеры, не привязанные к переменным, - atomic_thread_fence, - но, например, TSan не инструментирует atomic_thread_fence, то есть просто не замечает его. Других удобных инструментов среди свободных я не знаю :-(
Я соглашусь с тем, что atomic_thread_fence дает меньше простора компилятору для оптимзации, - но разве это плохо?.. Особенно в такой тонкой области, как memory ordering...
Да, я говорю о плюсах именно стандарта C++11, но не о плюсах его реализации в компиляторах, утилитах и (может быть удивитесь) в процессорах.
В современных компиляторах icc/clang, утилитах из Intel Cluster Studio и процессорах ARM v8 с этим более менее нормально.
Например, в относительно новом ARM v8 исходили именно из модели памяти стандарта C++11 - атомарные операции совмещены с барьерами памяти:
* store(seq), load(seq) не генерируют барьер dmb ish на новых ARM v8: https://godbolt.org/g/J0u2LU
* Но store(seq), load(seq) генерируют барьер bl на старых ARM: https://godbolt.org/g/ekowgC

А если писать store(relaxed), fence(seq), load(relaxed) то даже новому процессору ARM v8 придется генерировать dmb ish: https://godbolt.org/g/Aow2MB
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422756
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправил ссылку и dmb ish, вместо bl __sync_synchronize:
автор* Но store(seq), load(seq) генерируют барьер dmb ish на старых ARM: https://godbolt.org/g/V06gfN
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422917
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khizmax, Вася Уткин
Спасибо, никогда не задумывался об этой теме. Почитал статьи, позапускал примеры, посмотрел под дебагом... в общем, как в начале мало, что понимал, так и сейчас, хоть уже и в курсе, но всё равно мало понимаю.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422918
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkhizmax, Вася Уткин
Спасибо, никогда не задумывался об этой теме. Почитал статьи, позапускал примеры, посмотрел под дебагом... в общем, как в начале мало, что понимал, так и сейчас, хоть уже и в курсе, но всё равно мало понимаю.
Не поймёшь, пока не появится в этом необходимость. Только на практике это и можно понять. Сухой теорией здесь не обойтись.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39422923
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxБольшинство рассуждений сразу скатываются в atomic load/store с двумя, максимум тремя переменными. Алгоритмы lock-free структур данных работают часто с бОльшим числом атомарных переменных и не только с load/store, но и RMW (обычно CAS). Анализ правильности расстановки memory order в таких случаях весьма затруднен.
Я могу объяснить и на больших алгоритмах, со множеством RMW, там гораздо больше оптимизаций возможно. Но смысл? Если у одних из лучших разработчиков даже после детального доказательства вызывают вопросы примеры из 3-х переменных :)

khizmaxЯ соглашусь с тем, что atomic_thread_fence дает меньше простора компилятору для оптимзации, - но разве это плохо?.. Особенно в такой тонкой области, как memory ordering...
Это плохо из-за значительной потери производительности - доказал выше.
И плохо из-за меньшей надежности программы:
* барьеры неправильно совмещенные с неправильными операциями выдают ошибки компиляции: http://melpon.org/wandbox/permlink/HHalUgvmUAUxoaGH
* барьеры реализованные отдельно от операций как ни ставь не выдадут ошибки компиляции: http://melpon.org/wandbox/permlink/TxpwSSGWpnLqw5LY

Но вы правы, что большинство утилит и компиляторов пока работают с C++11 не так хорошо, да и процессоров чьим архитектурам больше 8 лет - не заточены под него :)
Со временем они дотянут до C++11.
Однако я не защищаю C++11, я считаю что будущее за Hardware Transactional Memory и Best practicies из GPU (CUDA/HIP). Рано или поздно CPU дорастут по ширине SIMD и количеству ALU до GPU.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39423208
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать
Любой вход/выход чтения/записи в/из критической секции - это нарушение семантики критической секции.
Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю ))
Но к сожалению, у меня нет времени сейчас вникать в это и разбираться.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39423214
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать
Любой вход /выход чтения/записи в /из критической секции - это нарушение семантики критической секции.
Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю ))
Но к сожалению, у меня нет времени сейчас вникать в это и разбираться.
Выделенное - абсолютно не верно, это азы многопоточного программирования. Ну дело ваше не верить стандарту C++11, ассемблеру генерируемому компиляторами gcc/clang/icc/msvc и документации Intel IA64, кто не разобрался - тому остается только верить во что-то
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39423260
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВыделенное - абсолютно не верно
Ну, наверно
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39423505
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxвроде бы общепринято, что для spin-lock достаточно acquire/release семантики: acquire RMW - вход в критическую секцию, release store - выход. Положим, что spin-lock защищает секцию, в которой мы только что-то сохраняем:
Код: plaintext
1.
2.
3.
4.
int x, y;
spin.lock()
x = 3;
y = 4;
spin.unlock()


Anatoly MoskovskyВася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать
Любой вход /выход чтения/записи в /из критической секции - это нарушение семантики критической секции.
Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю ))
Но к сожалению, у меня нет времени сейчас вникать в это и разбираться.

Anatoly MoskovskyСтранно, я всегда думал что через load/store совмещенный с seq_cst компилятору нельзя двигать операции в обе стороны (так же как и через release/acquire в одну сторону ), иначе например мьютекс не будет работать.
Я же вижу вы сами все прекрасно знаете :)
Т.е. для spin-lock достаточно acquire/release, к тому же через release/acquire нельзя двигать операции в одну сторону, тогда у меня вопрос к вам, в какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424469
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткин,
Я вижу, что вы очень хорошо понимаете memory ordering C++11. К сожалению, о себе я такого сказать не могу, - у меня типичный пример "бумажных знаний", когда вроде что-то знаешь, а применить на практике не можешь, либо можешь, но с большими сомнениями.
Вася УткинМогут быть переупорядочены: store(seq), store(relaxed)
Для меня это тоже было неожиданно - переупорядочение через seq_cst. Перечитал первоисточники, - вроде все верно, действительно могут. Хм...
Заметьте, ключевое слово здесь - "вроде", то есть я так до конца и не уверен, правильно ли я понял стандарт. Отсюда я делаю выводы:
либо я плохо понимаю английский

либо написано в стандарте все настолько математически строго и сжато, что требует немалого разжевывания и соотношения с реальностью

либо я полный нуб (этого тоже исключать нельзя)

Судя по тому, что я наблюдаю в инете и при личном общении, - скорее всего пункт 2.

Вася УткинЯ могу объяснить и на больших алгоритмах, со множеством RMW, там гораздо больше оптимизаций возможно. Но смысл? Если у одних из лучших разработчиков даже после детального доказательства вызывают вопросы примеры из 3-х переменных :)

В связи с этим у меня к вам предложение, даже два, на выбор:

1. Сложные вещи должны быть понятными. Мне кажется, что стандарту в части atomic и memory ordering не хватает некоего handbook, "memory ordering для чайников", где вполне понятным языком, но с точным доказательством со ссылками на пункты стандарта (назовем их аксиомами) был бы разбор типичных (и нетипичных) случаев переупорядочения. Причем ссылок на конкретные архитектуры в качестве доказательства быть не должно, - такие ссылки допустимы только как иллюстрации, - так как стандарт все же не привязан к конкретной архитектуре, поэтому следует ожидать, что компилятор может применять одни и те же оптимизации для любой архитектуры (понимаю, что это предположение спорно, но все же). Результатом такой работы могла бы быть статья/цикл статей, например, на хабре или где угодно, - думаю, было бы весьма интересно.

2. Мой шкурный интерес: провести code review в части memory ordering (но и в любой другой части тоже, если есть желание) библиотеки libcds . Я догадываюсь (точнее - знаю), что там багов в части memory order может быть много, об этом мне постоянно говорит TSan, но интерпретировать его ворнинги я часто не в состоянии, а не верить автору TSan я тоже не осмеливаюсь.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424472
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxскорее всего пункт 2
Уточнение: нумерация начинается с единицы ;-)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424474
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткинв какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :)
Наружу точно нельзя. А внутрь двигать это хамство - программисту лучше знать что должно быть внутри секции ))
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424477
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxВася Уткин,
Я вижу, что вы очень хорошо понимаете memory ordering C++11. К сожалению, о себе я такого сказать не могу, - у меня типичный пример "бумажных знаний", когда вроде что-то знаешь, а применить на практике не можешь, либо можешь, но с большими сомнениями.
Красиво затролили :)

khizmaxВася УткинМогут быть переупорядочены: store(seq), store(relaxed)
Для меня это тоже было неожиданно - переупорядочение через seq_cst. Перечитал первоисточники, - вроде все верно, действительно могут. Хм...
Заметьте, ключевое слово здесь - "вроде", то есть я так до конца и не уверен, правильно ли я понял стандарт. Отсюда я делаю выводы:
либо я плохо понимаю английский

либо написано в стандарте все настолько математически строго и сжато, что требует немалого разжевывания и соотношения с реальностью

либо я полный нуб (этого тоже исключать нельзя)

Судя по тому, что я наблюдаю в инете и при личном общении, - скорее всего пункт 2.

Возможно даже разработчики компиляторов не сразу поняли стандарт, судя по несуразным багам в некоторых компиляторах, в примерах из 1 операции: https://connect.microsoft.com/VisualStudio/feedback/details/770885
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424478
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxВася УткинЯ могу объяснить и на больших алгоритмах, со множеством RMW, там гораздо больше оптимизаций возможно. Но смысл? Если у одних из лучших разработчиков даже после детального доказательства вызывают вопросы примеры из 3-х переменных :)

В связи с этим у меня к вам предложение, даже два, на выбор:

1. Сложные вещи должны быть понятными. Мне кажется, что стандарту в части atomic и memory ordering не хватает некоего handbook, "memory ordering для чайников", где вполне понятным языком, но с точным доказательством со ссылками на пункты стандарта (назовем их аксиомами) был бы разбор типичных (и нетипичных) случаев переупорядочения. Причем ссылок на конкретные архитектуры в качестве доказательства быть не должно, - такие ссылки допустимы только как иллюстрации, - так как стандарт все же не привязан к конкретной архитектуре, поэтому следует ожидать, что компилятор может применять одни и те же оптимизации для любой архитектуры (понимаю, что это предположение спорно, но все же). Результатом такой работы могла бы быть статья/цикл статей, например, на хабре или где угодно, - думаю, было бы весьма интересно.

2. Мой шкурный интерес: провести code review в части memory ordering (но и в любой другой части тоже, если есть желание) библиотеки libcds . Я догадываюсь (точнее - знаю), что там багов в части memory order может быть много, об этом мне постоянно говорит TSan, но интерпретировать его ворнинги я часто не в состоянии, а не верить автору TSan я тоже не осмеливаюсь.
1. Может быть.
2. Вот тут боюсь или я рихнусь пока составлю схемы, или люди которые это будут читать Или просто скажут - не верю.


По поводу статей - на примере того же изменения порядка (store(relaxed) <--> load(seq)):

1.1. Например, в стандарте C++11 § 29.3 (3): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
Есть такая фраза: There shall be a single total order S on all memory_order_seq_cst operations , consistent with the “happens before”...
- Т.е. чтобы доказать, что у seq_cst-операций есть единый порядок - достаточно привести эту цитату.
- Но чтобы доказать, что что у любых других операций нет единого порядка с seq_cst-операциями, надо доказать, что такого нигде в стандарте не написано:)

1.2. С другой стороны, если по логике :
- Чтобы доказать что чего-то никогда не бывает - надо привести строгую цитату
- Чтобы доказать что что-то хотябы иногда может быть - достаточно показать хотябы один случай

Т.е. для memory_order по логике:
- Чтобы доказать то, чего никогда не может быть (не может быть переупорядочивания seq-операций) - надо привести цитату со строгой гарантией - для этого достаточно привести эту цитату: There shall be a single total order S on all memory_order_seq_cst operations , consistent with the “happens before”...
- А чтобы доказать то, что не обязательно, но в принципе может быть (store(relaxed) <--> load(seq)) - достаточно привести хотя бы один пример показывающий его существование.

Но вы пишите: "Причем ссылок на конкретные архитектуры в качестве доказательства быть не должно"
Тогда остается только доказать, что нигде в стандарте не написано "у любых не-seq-операций есть единый порядкок с seq_cst-операциями" - как это сделать? :)

А вы вообще не думали libcds в boost продвинуть, или хотябы какие-то части libcds в стандарт?
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424487
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася Уткинв какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :)
Наружу точно нельзя. А внутрь двигать это хамство - программисту лучше знать что должно быть внутри секции ))

Обкладывайте критическую секцию снаружи std::atomic_thread_fence(std::memory_order_seq_cst); https://godbolt.org/g/CT89i5
ни одна муха не пролетит в неё, и увидите по изменению производительности - кому лучше знать :)
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39424492
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася УткинА вы вообще не думали libcds в boost продвинуть, или хотябы какие-то части libcds в стандарт?
Думать-то может я и думал (про boost), даже где-то году в 2010-м скромно пульнул в boost-list анонс версии (сейчас краснею, - там ляпов было много), но это огромная работа, да и не весь libcds, а только его наиболее интересные части.
Дело в том, что libcds построен по принципу "сделай сам", - я стараюсь выносить многие алгоритмы в настройки через traits, отсюда и частые упреки, что слишком сложно. Я позиционирую libcds как средство проверки: появился новый алгоритм, скажем, обращения порядка бит в хеше, - подставил его через traits в split-ordered list и проверил, как оно. Или новый lock-free список, который сам по себе ни к чему не нужен, - путем несложных манипуляций (в основном по принципу copy-paste) встраивается в уже разработанный хеш, - и можно пробовать, как оно в действии.
Для продвижения в стандарт тоже нужно много времени - это в основном бюрократическая работа, + хорошее знание английского. Для меня английский - как древнеегипетский для египтологов: читать могу (конечно, не Диккенса в оригинале), могу что-то написать (хотя сам вижу - написано по-русски английскими буковами), разговорную речь понимаю через пень.
Libcds - это продукт выходного дня и долгих зимних вечеров. Я бы хотел и впредь заниматься чем-то интересным, кодить, пробовать новые алгоритмы, а не заниматься бюрократией.

По поводу статей. А если взглянуть так: стандарт - набор аксиом. На любой аксиоматике, если она не противоречива, зиждется стройное здание теории - набор следствий (теорем), вытекающих из аксиом; в конце концов цепочка этих выводов приводит к утверждениям, которые легко претворять в жизнь и легко им следовать. Core guide for memory ordering, так сказать.

Честно говоря, меня вот уже эта цитата стандарта
авторThere shall be a single total order S on all memory_order_seq_cst operations, consistent with the “happens before”...
заставляет морщить мозги: чо такое "single total order", чо - "consistent", чо - "happens before". И вообще, какой single, когда у нас несколько потоков выполняются каждый раз в разном порядке. Для каждого запуска - свой single total order? То есть это некая post-mortem конструкция, которую воспроизвести нельзя?.. В общем, вопросы вот такого чайниковского характера.


И наконец, комментарий к шкурному интересу:
Вася Уткин2. Вот тут боюсь или я рехнусь пока составлю схемы, или люди которые это будут читать Или просто скажут - не верю.
Не всю же либу сразу... Можно начать с простого, - схема Hazard Pointer, алгоритмы очередей, списков. Можно просто взять выхлоп TSan'а с ошибками и отревьюить что-то одно. Если, конечно, интересно. Как минимум отдельную запись в файле thanks обещаю :-)
А про схемы можно и поподробнее...
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425190
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А например следующие 2 цитаты стандарта сойдут за гарантию того, что не-seq-операция в некоторых случаях может переупорядочиваться с seq-операцией?

1. (из 1-й цитаты): Любое использование не-seq-операций даже если все остальные seq-операции - нарушает последовательную согласованность (sequential consistency).

2. (из 2-й цитаты): Последовательная согласованность "sequential consistency" - когда операции в нескольких потоках выполняются по очереди, где следующая операция видит все предыдущие операции полностью завершенными.

Т.е. если многопоточная программа состоит только из seq-операций и мы добавляем одну не-seq-операцию, то аннулируем гарантию последовательной согласованности, т.е. не все операции теперь выполняются по очереди как в одном порядке, и нет единого порядка.


Сами цитаты:

Любое использование не-seq-операций даже если все остальные seq-операции - нарушает последовательную согласованность (sequential consistency):
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf § 29.3
8 [ 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 operations. Any use of weaker ordering will invalidate this guarantee unless extreme care is used. In particular, memory_order_seq_cst fences ensure a total order only for the fences themselves. Fences cannot, in general, be used to restore sequential consistency for atomic operations with weaker ordering specifications. — end note ]

автор 8. memory_order_seq_cst обеспечивает последовательную согласованность только для программы , в которой нет гонок данных (data-races) и которая использует исключительно только memory_order_seq_cst операции. Любое использование более слабого упорядочивания аннулирует гарантию последовательной согласованности , за исключением если это не используется крайне осторожно. В частности, memory_order_seq_cst барьеры обеспечивают общий порядок только для самих барьеров. Барьеры, в общем случае, не могут восстановить последовательную согласованность для атомарных операций использующих более слабое упорядочивание, чем memory_order_seq_cst.

[прим. ред. Т.е. тут прямо сказано, что "Любое использование более слабого упорядочивания аннулирует гарантию последовательной согласованности", т.е. использование любой не-seq_cst операции среди всех других seq_cst операций - аннулирует последовательную согласованность ]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <atomic>

// Atomic load-store
void test() {
    std::atomic<int> a, b, c;
    a.store(2, std::memory_order_seq_cst);          // seq_cst
    c.store(4, std::memory_order_relaxed);          // non-seq_cst - § 29.3 (8) - Any use of weaker ordering will invalidate this guarantee - sequential consistency    
    int tmp = b.load(std::memory_order_seq_cst);    // seq_cst
}




А тут описывается термин последовательная согласованность "sequential consistency" - когда операции в нескольких потоках выполняются по очереди, где следующая операция видит все предыдущии полностью завершенными:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf § 1.10.2
19 Two actions are potentially concurrent if
(19.1) — they are performed by different threads
, or
(19.2) — they are unsequenced, and at least one is performed by a signal handler.

... [ Note: It can be shown that programs that correctly use mutexes and memory_order_seq_cst operations to prevent all data races and use no other synchronization operations behave as if the operations executed by their constituent threads were simply interleaved, with each value computation of an object being taken from the last side effect on that object in that interleaving. This is normally referred to as “sequential consistency”. However, this applies only to data-race-free programs, and data-race-free programs cannot observe most program transformations that do not change single-threaded program semantics. In fact, most single-threaded program transformations continue to be allowed, since any program that behaves differently as a result must perform an undefined operation. — end note ]

автор 19 Два действия потенциально конкурируют (исполняются одновременно) если
(19.1) - они исполняются в разных потоках
, или
(19.2) - они не последовательны, и как минимум одно из них выполняется обработчиком сигнала.
...
Можно показать, что программа правильно использующая мьютексы и memory_order_seq_cst-операции для предотвращения гонок данных и не использующая других операций синхронизации ведет себя так, как если бы операции выполняемые их потоками (в разных потоках) - были просто чередованием операций [прим. ред: как если бы выполнялись в одном потоке], где каждая следующая операция видит все предыдущими операции полностью завершенными со всеми их сторонними эффектами (со всеми side-effect). Это как правило называют "последовательная согласованность". Однако, это применимо только к программам без гонок данных (data-race-free, т.е. без многопоточных ошибок), и такие программы без гонок данных не могут наблюдать большинство преобразований [прим.ред. переупорядочиваний] программы, которые не изменяют однопоточную семантику. На самом деле, большинство однопоточных преобразований [прим.ред. переупорядочиваний] программы по прежнему возможны, т.к. любая программа которая ведёт себя по разному в результате должна выполнять неопределенную операцию. [прим.ред. последнюю часть предложения я сам не понял :) но это не важно ]


Про libcds ещё подумаю, в любом случае если и буду начинать то со статьи или мануала.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425193
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxПо поводу статей. А если взглянуть так: стандарт - набор аксиом. На любой аксиоматике, если она не противоречива, зиждется стройное здание теории - набор следствий (теорем), вытекающих из аксиом; в конце концов цепочка этих выводов приводит к утверждениям, которые легко претворять в жизнь и легко им следовать. Core guide for memory ordering, так сказать.
Я имею ввиду, что кто-то может сказать, что в стандарте есть какая-нибудь бредовая гарантия, что, например: все обычные float-переменных упорядочены.
Оно там где-то есть, где именно этот некий человек не помнит, ну а вы все просто плохо ищите
А т.к. опровержения всех бредовых мыслей в стандарте конечно же нет, то таким людям никогда не докажешь что нет строго порядка у обычных float.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425221
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf § 29.3
8 [ 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 operations. Any use of weaker ordering will invalidate this guarantee unless extreme care is used. In particular, memory_order_seq_cst fences ensure a total order only for the fences themselves. Fences cannot, in general, be used to restore sequential consistency for atomic operations with weaker ordering specifications. — end note ]
Что-то сильно ограничили они. Если исходить из этой цитаты, выходит что т.к. в любой реальной программе всегда есть операции без барьеров , то seq_cst не дает вообще никаких гарантий.
А это явно не так. Т.е. есть еще какие-то условия.

Вася УткинОбкладывайте критическую секцию снаружи std::atomic_thread_fence(std::memory_order_seq_cst); https://godbolt.org/g/CT89i5
ни одна муха не пролетит в неё, и увидите по изменению производительности - кому лучше знать :)
Ну, в С++ мьютексы реализованы через вызовы фукнций, а вызов функции, даже если она потом инлайнится, это барьер, так что через него муха точно не пролетит, по крайней мере при компиляции.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425238
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf § 29.3
8 [ 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 operations. Any use of weaker ordering will invalidate this guarantee unless extreme care is used. In particular, memory_order_seq_cst fences ensure a total order only for the fences themselves. Fences cannot, in general, be used to restore sequential consistency for atomic operations with weaker ordering specifications. — end note ]
Что-то сильно ограничили они. Если исходить из этой цитаты, выходит что т.к. в любой реальной программе всегда есть операции без барьеров , то seq_cst не дает вообще никаких гарантий.
А это явно не так. Т.е. есть еще какие-то условия.
Видимо детальное описание что когда и с чем может иметь или менять порядок, а что не может - составляло множество страниц, поэтому они решили ограничится дополнительной фразой "unless extreme care is used"
Но по крайней мере эта цитата стандарта точно говорит, что в приведенных мною выше примерах не гарантируется "sequential consistency" для всех операций, а значит не гарантируется "single total order" для всех операций и не гарантируется по очередность выполнения инструкций.


Anatoly MoskovskyВася УткинОбкладывайте критическую секцию снаружи std::atomic_thread_fence(std::memory_order_seq_cst); https://godbolt.org/g/CT89i5
ни одна муха не пролетит в неё, и увидите по изменению производительности - кому лучше знать :)
Ну, в С++ мьютексы реализованы через вызовы фукнций, а вызов функции, даже если она потом инлайнится, это барьер , так что через него муха точно не пролетит, по крайней мере при компиляции.
Вы имеете ввиду, что вызов любой функции в C++ инициирует spilling-всех переменных? Есть цитата стандарта? :)
Иначе все что вы писали в переменные до вызова этой функции так и останется в регистрах процессора надолго.
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425311
khizmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
standardIn fact, most single-threaded program transformations continue to be allowed, since any program that behaves differently as a result must perform an undefined operation

Мне кажется, что по-русски это звучит так: "Фактически, большинство однопоточных трансформаций кода по-прежнему разрешены, так как любая программа, которая работает по-разному [я так понимаю, на разных запусках выдает разный результат], в конечном итоге должна выполнить/привести к неопределенной операции". То есть если что-то нарушено, есть data race, то сам виноват - UB, - а компилятор волен применить все допустимые преобразования. Отсюда также следует, что генератор случайных чисел - UB по определению
Но, ИМХО, этот язык - мрак... Теперь я понимаю, откуда у Страуструпа & Co родилась идея C++ Core Guidelines: посмотрели они на 100500 страниц стандарта и подумали: "каждая фраза - правда, а вместе - какой-то винегрет. Надо как-то объяснить народу..."

Вася УткинТ.е. если многопоточная программа состоит только из seq-операций и мы добавляем одну не-seq-операцию, то аннулируем гарантию последовательной согласованности, т.е. не все операции теперь выполняются по очереди как в одном порядке, и нет единого порядка.
По большому счету мне seq-cst до лампочки (господи, что я говорю...) - вы (это я к авторам стандарта) дайте ясные и понятные правила, как мне избежать data race на слабой модели памяти. Не можете сформулировать мысль ясно, - значит, она (мысль) ещё не созрела. Сейчас выглядит все как каста жрецов (это я опять об авторах стандарта), - вы, плебс, используйте seq-cst, а высшую математику оставьте людям знающим... Обидно

Почитал я все это - спасибо Васе Уткину за избранные цитаты из стандарта, - и понял, что моя идея насчет стройного здания теории на основе "аксиом" из стандарта, - полный бред.

Вася Уткинесли и буду начинать то со статьи или мануала.
Начинать надо, и не затягивайте, удачи!
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425326
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khizmaxТеперь я понимаю, откуда у Страуструпа & Co родилась идея C++ Core Guidelines: посмотрели они на 100500 страниц стандарта и подумали: "каждая фраза - правда, а вместе - какой-то винегрет. Надо как-то объяснить народу..."
Но пока что про memory_order_seq_cst они написали только 2 строчки )
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines Exception Atomic variables can be used simply and safely , as long as you are using the sequentially consistent memory model (memory_order_seq_cst), which is the default.
Это легко и безопасно, а вы говорите мрак
...
Рейтинг: 0 / 0
Какую библиотеку посоветуете с потокобезопасными контейнерами?
    #39425606
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВы имеете ввиду, что вызов любой функции в C++ инициирует spilling-всех переменных? Есть цитата стандарта? :)
Не думаю что в стандарте упомянуто слово spilling )))
Поищу про барьер.
...
Рейтинг: 0 / 0
82 сообщений из 82, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какую библиотеку посоветуете с потокобезопасными контейнерами?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]