Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Насколько я понял в Qt и в Boost таких контейнеров не реализовано. Есть в Intel ТВВ, но я пока эту библиотеку не использовал. Кто что использует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 22:35 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, Смотрели в boost::lockfree? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 23:01 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, Ещё можете глянуть на libcds , её разрабатывает один местный дядька уже давно. Был пару раз на его стэндапах, вроде своё дело знает, хотя некоторые из его высказываний вогнали меня в ступор... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 23:06 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZ хотя некоторые из его высказываний вогнали меня в ступор... Например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 23:41 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял в Qt и в Boost таких контейнеров не реализовано. Есть в Intel ТВВ, но я пока эту библиотеку не использовал. Кто что использует? в последнее время всё чаще free-lock выходит из гик-сообщества, но до продакшена ещё далеко на мой взгляд лучше не ходить туда, пока свой контейнер не напишешь (хотя бы стэк, очередь) и по всем граблям не пройдёшь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 06:59 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинNekZ хотя некоторые из его высказываний вогнали меня в ступор... Например? Например, что не нужно математически доказывать корректность алгоритма -- нужно его обложить кучей грубых и нагрузочных тестов в продакшне. Типа "ну а мне-то чо, что доказано? Главное чтобы работало стабильно" Или его подход к проектированию кода -- прямо на стэндапе показывал как подпирает свой код костылями (ещё и в виде макросов). Может, это был и единственный вариант, но показывать такое публике я бы не стал, так как у опытных пользователей C++ сразу в подсознании вспыхивает "TRIGGERED! Monkey code detected!". В общем и целом, у меня сложилось впечатление, что они пишут софт чисто под своё железо и не задумываются о масштабируемости и переносимости на другие конфигурации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:29 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)в последнее время всё чаще free-lock выходит из гик-сообщества, но до продакшена ещё далеко на мой взгляд лучше не ходить туда, пока свой контейнер не напишешь (хотя бы стэк, очередь) и по всем граблям не пройдёшь Прочитал книжки "Практическое программирование на С++ " (Боровский) и "Параллельное программирование на С++ в действии" (Уильямс). В книгах даны разные примеры очередей без блокировок, которые не факт, что будут качественно работать в промышленных масштабах. В результате пришел к выводу, что на самостоятельную реализацию и тестирование у меня уйдет много времени, которого очень жаль. Основные проблемы возникающие при многопоточном программировании и так понятны. Да и зачем изобретать велосипед, если возможно уже есть протестированные и даже оптимизированные по производительности решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:41 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZAlekseySQL, Смотрели в boost::lockfree? Спасибо! Мне как раз очередь нужна для передачи сообщений от дочерних потоков родительскому, чтобы быть в курсе процесса работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:47 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:54 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, а готов? я вот думаю, что прежде чем садиться за гоночный болид надо бы немного "подтянуться и поднатаскаться" на чём ни будь попроще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 09:46 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)я вот думаю, что прежде чем садиться за гоночный болид надо бы немного "подтянуться и поднатаскаться" на чём ни будь попроще Нет, вы предлагаете собрать болид своими руками. Во время сборки болида вы начнете утверждать, что надо разобраться в изготовлении деталей и сделать их также самостоятельно. Когда будете делать детали, то вам придет гениальная мысль, что надо бы научиться выплавлять металл (а то не спортивно как-то!). При реализации последнего вам захочется заняться геологоразведкой и примерно тут вы помрете от старости так ничего и не сделав за всю жизнь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 11:24 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, ох люблю молодых прытких вот вам потренироваться на кошках , у Dima T там очередь и пул акторов, которые можно заменить на free-lock вариант. Он утвердает что будет медленнее, дакажете обратное? вот его проектик: https://github.com/Dmitriy-GH/lite_thread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 11:34 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНет, вы предлагаете собрать болид своими руками. Во время сборки болида вы начнете утверждать, что надо разобраться в изготовлении деталей и сделать их также самостоятельно. Когда будете делать детали, то вам придет гениальная мысль, что надо бы научиться выплавлять металл (а то не спортивно как-то!). При реализации последнего вам захочется заняться геологоразведкой и примерно тут вы помрете от старости так ничего и не сделав за всю жизнь. Ну вообще, это правильный подход. Хочешь управлять гоночным болидом в совершенстве, не вылетев на первом же повороте -- тебе нужно знать как функционирует каждая деталь и из чего она сделана. Раз уж вы читали Уильямса, то должны понимать это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 11:42 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Народ, подскажите есть ли пулы потоков с установкой приоритета потока? В бустовском thread_group, кьютовском QThreadPool и даже в стандартных Thread от не нашел. Неужели нет пулов, где можно указать приоритет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 11:46 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZВася Уткинпропущено... Например? Например, что не нужно математически доказывать корректность алгоритма -- нужно его обложить кучей грубых и нагрузочных тестов в продакшне. Типа "ну а мне-то чо, что доказано? Главное чтобы работало стабильно" Или его подход к проектированию кода -- прямо на стэндапе показывал как подпирает свой код костылями (ещё и в виде макросов). Может, это был и единственный вариант, но показывать такое публике я бы не стал, так как у опытных пользователей C++ сразу в подсознании вспыхивает "TRIGGERED! Monkey code detected!". В общем и целом, у меня сложилось впечатление, что они пишут софт чисто под своё железо и не задумываются о масштабируемости и переносимости на другие конфигурации. Я думаю на конференции/стендапе понятно доказать корректность даже части libcds не успеешь, в то же время доказательства есть в куче научных работ откуда он набрал большинство алгоритмов. А понятно объяснить как доказывать корректность собственных wait/lock-free алгоритмов - это целую книгу писать. Я понимаю что такое схематически доказать корректность многопоточного алгоритма в терминах std::memory_order и построить дерево событий, но что такое - доказать математически ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 12:23 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинЯ понимаю что такое схематически доказать корректность многопоточного алгоритма в терминах std::memory_order и построить дерево событий, но что такое - доказать математически ? Здесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 12:30 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZЗдесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма . Лучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора. Платят за программу - значит правильный алгоритм. А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 14:52 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, Я лично очень сомневаюсь, что тебе нужны потокобезопасные контейнеры. Ну и "потокобезопасный" -- понятие растяжимое, там по каждой операции есть описание, какие гарантии безопасности в разных потоках даются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 15:14 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНарод, подскажите есть ли пулы потоков с установкой приоритета потока? В бустовском thread_group, кьютовском QThreadPool и даже в стандартных Thread от не нашел. Неужели нет пулов, где можно указать приоритет? Нет, нету. Но ты можешь поставить приоритеты используя непереносимые средства конкретной OC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 15:31 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Тогда решил делать свой менеджер с Qt- потоками (у которых есть возможность задать приоритет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 18:32 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)вот вам потренироваться на кошках , у Dima T там очередь и пул акторов, которые можно заменить на free-lock вариант. Он утвердает что будет медленнее, дакажете обратное? Не надо перевирать то, что не понял. Я там говорил две несвязные меж собой мысли: 1. Я не хочу переделывать очередь с критических секций на lock-free, т.к. сам я такое написать не смогу. Написал как смог. 2. В другом месте у меня уже lock-free, но надо обойтись вообще без пересечений потоков, без доступа всех потоков в одну точку памяти. Без блокировки быстрее чем с блокировкой, неважно lock-free, мутексы и т.д. lock-free не бесплатен. Ты скрестил первое со вторым и дальше по форуму разносишь. Зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 19:00 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZiv, Тогда решил делать свой менеджер с Qt- потоками (у которых есть возможность задать приоритет). Подумай еще зачем тебе это надо. Если ты не видишь другого решения - это не значит что его нет. Приоритеты очень опасная штука, стрелять в ногу с ними элементарно, скорее всего поэтому их нет. Например запустится твоя прога создаст приоритетных потоков столько сколько ядер и начнет в них молотить долго и упорно, а у юзера в соседнем окне браузер колом встанет ... Подумай еще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 19:09 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyNekZЗдесь речь шла об алгоритмах в общем случае, не о многопоточности, т.е. работает ли алгоритим корректно на любых входных данных, доказано ли это путём анализа алгоритма . Лучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора. Платят за программу - значит правильный алгоритм. А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный ))) Поэтому я и ушёл из IT ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:16 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЛучшее доказательство того что реализованный алгоритм правильный - это сумма на счету автора. Платят за программу - значит правильный алгоритм. А если автор доказал математически корректность алгоритма, но умер от голода, то алгоритм точно некорректный )))А если правильный, но opensource/freeware? Да и за сам алгоритм обычно ничего никогда не платят, платят за программу, которая позволяет удобно этим алгоритмом пользоваться. Чем удобнее программа, тем приятнее платят. Пример: Windows SDK(free, pure) vs MS Visual Studio(pay, handy) (да, удобство студии субъективно, но только по сравнению с другими IDE, а по сравнению с SDK оно очевидно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 05:30 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Dima TПриоритеты очень опасная штука, стрелять в ногу с ними элементарно, скорее всего поэтому их нет. Например запустится твоя прога создаст приоритетных потоков столько сколько ядер и начнет в них молотить долго и упорно, а у юзера в соседнем окне браузер колом встанет ... Подумай еще. Я наоборот хочу поставить очень низкий приоритет своим потокам. Таким образом мне удастся запустить 4 дочерних потока (по количеству ядер) + основной поток для показа текущих сообщений из дочерних. Причем в этом случае основной поток не будет тормозить, потому что у него относительно дочерних потоков будет высокий приоритет и в тоже время ядро не будет простаивать между показами информации о ходе работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 08:15 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ наоборот хочу поставить очень низкий приоритет своим потокам. Таким образом мне удастся запустить 4 дочерних потока (по количеству ядер) + основной поток для показа текущих сообщений из дочерних. Причем в этом случае основной поток не будет тормозить, потому что у него относительно дочерних потоков будет высокий приоритет и в тоже время ядро не будет простаивать между показами информации о ходе работы. Средствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить. Для виндовса GetCurrentThread() и SetThreadPriority() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 09:12 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
CEMbА если правильный, но opensource/freeware? Вы думаете за это не платят? Думаете, миллионы строк кода в ядре линукса написаны людьми которые не получают зарплату, просто как хобби? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 12:18 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Привет, я тот самый дядька, который гонит пургу на стендапах :-) Не мог пройти мимо 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 кода - это именно костыли. Костыли для того, чтобы любое промежуточное состояние контейнера в процессе вставки/удаления элемента было персистентным. Поэтому я предпочитаю термин "трюки" ;-) Костыль - это кеши процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 14:53 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxВообще, я скажу крамольную вещь, - модель памяти C++ так, как она описана в стандарте, нежизнеспособна. Это набор аксиом, весьма слабо коррелирующих с реальным положением дел в hardware. Это мое сугубое ИМХО, но оно косвенно подтверждается, например, нежеланием разработчиков Linux переходить на модель памяти C++11 (как Вы помните, модель памяти C++11 также распространяется на C11), и это нежелание они (Linux developers) весьма неплохо аргументируют. А есть ссылка на эти аргументы? И есть ли где-то кросс-процессорная модель памяти, которая лучше? Помимо memory_order_cunsume - кандидата на depricated, и не использования всех возможностей LL/SC - явных косяков не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 16:47 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Да, ссылки есть, например, одно из последних: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0124r1.html Вообще, у Paul McKenney много об этом. Но разговор идет не о том, что лучше/хуже, а о том, что они (модели памяти) различны. Ядро Линукса использует более "старую" модель (read/write barriers), которая возникла как раз из железа и зачастую более понятна в применении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:40 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Dima TСредствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить. Для виндовса GetCurrentThread() и SetThreadPriority() Спасибо, обдумаю ваше предложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 21:54 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВы думаете за это не платят? Думаете, миллионы строк кода в ядре линукса написаны людьми которые не получают зарплату, просто как хобби? я не знаю. Но если тут проскочило слово "зарплата", значит кто-то кому-то платит зарплату с доходов этого opensourse/freeware, вопрос в том, как этот кто-то этот доход получает. Я, конечно, новичок во всех этих коммерческих операциях, но мне кажется, что free vs pay отличается только тем, что в начале, "деньги" или "стулья", если сначала стулья (раздаём ядро бесплатно, делает сопровождение/консультации/доработки/да просто берём трубку телефона - за деньги), то есть вполне ощутимый шанс остаться без денег, особенно если ты никому не известный разработчик, даже если супер-гениальный. Если я не прав, то мне бы сильно хотелось узнать, как можно заработать на freeware одинокому девелоперу, я этой темой давно интересуюсь. khizmaxВообще, я скажу крамольную вещь, - модель памяти C++ так, как она описана в стандарте, нежизнеспособнаа можно небольшой экскурс по теме, как оно устроено, и почему оно плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 05:33 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
CEMbмне бы сильно хотелось узнать, как можно заработать на freeware одинокому девелоперу, я этой темой давно интересуюсь. Там заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 07:45 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxПривет, я тот самый дядька, который гонит пургу на стендапах :-) Это хорошо, что ты к нам пришёл, я очень рад. Мне очень понравился твой доклад в первой трети, в связи со здоровым желанием выработать правильный подход к разработке многозадачного кода. Я целиком это поддерживаю, потому что уж очень много сейчас разрабов, желающих запустить 2000 потоков на любой чих... Остальное пока не смотрел, встал на моделях многопоточной/задачной обработки, -- тоже интересно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 09:51 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Dima TСредствами ОС внутри потока понижай приоритет, по завершению возвращай как было. Не надо никаких менеджеров самодельных городить. Для виндовса GetCurrentThread() и SetThreadPriority() Я сижу под Linux и тут инет говорит, что приоритет меняется специальной структурой у объекта pthread_t. Такого объекта у меня нет, если все делать средствами qt. Как находясь в методе run изменить приоритет в Linux? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 10:03 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Не силен в линуксах. Гугл в помощь . Немного почитал, как понимаю там еще права замешаны, снизить вроде сможешь, а обратно повысить только с правами суперпользователя (root, sudo), т.е. если твоя прога будет без прав, то никаким способом не повысит обратно. Только поток завершать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 10:27 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Dima TТам заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время.покажите мне хоть одного такого разработчика. Шароварщиков я много видел, работающих по одному. Но вот ни одного фриварщика с деньгами не видел. Там должен быть адовый порог входа, чтобы себе такой имидж в одиночку сделать и не быть задавленным более крупными командами, тем более если это опенсорс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 11:11 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 11:42 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
CEMbDima TТам заработки на конкретных внедрениях и консалтинге. Потом это зарабатывание имиджа как разработчика, т.е. резюме конкретными делами. Для заработка на том и другом необходимо время.покажите мне хоть одного такого разработчика. Nginx . Думаю у разработчика оплачиваемой работы хватает. Но таких единицы, кто в одиночку что-то массовое создал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 12:26 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Сорри, мужик, не хотел чтобы что-то грубо прозвучало про твои выступления, просто прими ожидаемую реакцию/критику публики со стендапов. khizmaxУ современных процессоров кеши когерентные, так что "A записал, а B не увидел" - с точки зрения кеша такого быть не может. Но вот порядок/order , в котором B увидит то, что записал A, может быть другим. И виноват в этом не кеш, а небольшой костыль в виде store buffer между каждым ядром процессора и L1 кешем. А разве не было заявлено много раз про то, что разные потоки, могут выполняться на разных процессорах , что будет триггерить перебрасывание кэшей между процессорами, что является серьёзным оверкиллом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 13:07 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZ, Несомненно, было заявлено, но при этом когерентность кешей разных процессоров никто не отменяет. Именно поэтому в многопроцессорных системах так тормозит обращение к данным "чужого" процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 13:22 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxNekZ, Несомненно, было заявлено, но при этом когерентность кешей разных процессоров никто не отменяет. Именно поэтому в многопроцессорных системах так тормозит обращение к данным "чужого" процессора. приветствую как-то довольно печальненько однако простой интерлок переменной у меня на i7 упирается в 40 млн операц./c, с 150 млн./с на 1-м ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 13:55 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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. Я хочу дать возможность компилятору двигать c.store() в любую сторону: до a.store() или после b.load() - это даст компилятору больше манёвров для оптимизации. И в данном случае компилятор это сделать может. Теперь перепишу этот код, как если бы мы делали с барьерами памяти отделенными от операций (для корректности оставлю переменные атомарными но всегда в них буду использовать самую слабую relaxed): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В какой бы из 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. На всех типичных компиляторах x86_64 может быть пере-упорядочен так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:50 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, я ждал этого вопроса, про оптимизации компилятора ;-) Вы уже все сами ответили - да, барьеры также являются и барьерами компилятора. Полагаю, 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 - это лишь первая итерация, ещё далекая до идеала. И я рад, что нашлись линуксоиды-ядерщики, которые задают комитету похожие вопросы, - значит, дискуссия продолжится и решение будет найдено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 17:14 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 18:37 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Поправил: Вася Уткин a.store(seq_cst) <-> c.load(relaxed) c.store(relaxed) на PowerPC: https://godbolt.org/g/oZGB4x ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 20:36 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
NekZAlekseySQL, Смотрели в boost::lockfree? Посмотрел, и разочаровался: у очереди один метод push, который Not Thread-safe ( http://www.boost.org/doc/libs/1_63_0/doc/html/boost/lockfree/queue.html). У меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 13:24 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLПосмотрел, и разочаровался: у очереди один метод push, который Not Thread-safe ( http://www.boost.org/doc/libs/1_63_0/doc/html/boost/lockfree/queue.html). У меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток). Странно, а по ссылке, что вы привели, написано, что он Thread-safe Вообще было бы странно если бы операции модификации очереди, которая по дизайну потокобезопасна, вдруг оказались недопустимы в потоках ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 13:35 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинНасчет оптимизаций компилятора, допустим, у меня есть код (здесь Store-Load последовательность, которая без seq_cst могла бы переупорядочиваться): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Я хочу дать возможность компилятору двигать c.store() в любую сторону: до a.store() или после b.load() - это даст компилятору больше манёвров для оптимизации. И в данном случае компилятор это сделать может. Странно, я всегда думал что через load/store совмещенный с seq_cst компилятору нельзя двигать операции в обе стороны (так же как и через release/acquire в одну сторону), иначе например мьютекс не будет работать. Т.е. мое понимание было что load/store эквивалентно неатомарным операциям + отдельный барьер. И весь спор про разницу моделей С++ и линукса ни о чем кроме синтаксиса. Нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 13:41 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВася УткинНасчет оптимизаций компилятора, допустим, у меня есть код (здесь Store-Load последовательность, которая без seq_cst могла бы переупорядочиваться): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Я хочу дать возможность компилятору двигать 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:43 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Ссылка на 4 возможных реализации seq_cst на x86_64: http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:46 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 15:29 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLУ меня все наоборот: много писателей (дочерние потоки) и один читатель (основной поток). Во время разбирательства с акторами заметил такой момент: скорость заметно падает (в разы) когда все потоки начинают активно менять один и тот же участок памяти. У тебя это хвост очереди. И lock-free тут не панацея. ИМХО Тут архитектуру надо менять: каждый пишет в свою очередь, а читатель читает все очереди. Тогда писатели друг-другу мешать не будут. Затести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 16:44 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Можешь ZeroMQ поизучать, это либа сообщения гонять, можно по сети, можно межпоточно (просто указатели передаются). Соединение из двух сокетов ZMQ_PAIR это и будет очередь, а для ожидания нескольких сокетов есть zmq_poll() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 17:00 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 20:01 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Dima TМожешь ZeroMQ поизучать, это либа сообщения гонять, можно по сети, можно межпоточно (просто указатели передаются). Соединение из двух сокетов ZMQ_PAIR это и будет очередь, а для ожидания нескольких сокетов есть zmq_poll() Спасибо, но думаю, что обойдусь очередями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 20:03 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинА раз компилятор оставляет возможность таких переупорядочиваний процессору, значит и сам компилятор может делать эти же переупорядочивания. Ну, я бы остерегся делать какие-либо выводы на основе реализации компиляторов. Не говоря уже о том что отсутствие упорядочивания от компилятора не означает что процессор может переупорядочивать. Вполне возможно и другая причина - компилятор знает что проц. не будет переупорядочивать и поэтому не делает барьер. Касательно вообще поднятого мной вопроса, то по всей видимости порядок гарантируется только среди доступов с seq_cst , а все что без него может передвигаться. В этом случае непонятно как все работает )) Все вот эти примеры с машинным кодом не слишком проясняют. Позже еще почитаю и поэкспериментирую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 22:41 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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 Ну а строго - именно так и написано в стандарте, но как я понял его никто не понимает, кроме тех кто писал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 00:33 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, Я согласен с вами, что указание порядка прямо с атомарной инструкцией, как это задано в 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. Общее замечание: мне кажется, мы, по сути, говорим об одном и том же, только вы защищаете подход 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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 23:53 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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. Да, не поняли, но я описал очень строго. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 00:42 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Поправил ссылку и dmb ish, вместо bl __sync_synchronize: автор* Но store(seq), load(seq) генерируют барьер dmb ish на старых ARM: https://godbolt.org/g/V06gfN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 01:50 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmax, Вася Уткин Спасибо, никогда не задумывался об этой теме. Почитал статьи, позапускал примеры, посмотрел под дебагом... в общем, как в начале мало, что понимал, так и сейчас, хоть уже и в курсе, но всё равно мало понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 10:52 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
CEMbkhizmax, Вася Уткин Спасибо, никогда не задумывался об этой теме. Почитал статьи, позапускал примеры, посмотрел под дебагом... в общем, как в начале мало, что понимал, так и сейчас, хоть уже и в курсе, но всё равно мало понимаю. Не поймёшь, пока не появится в этом необходимость. Только на практике это и можно понять. Сухой теорией здесь не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 10:53 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 10:56 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать Любой вход/выход чтения/записи в/из критической секции - это нарушение семантики критической секции. Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю )) Но к сожалению, у меня нет времени сейчас вникать в это и разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 14:15 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать Любой вход /выход чтения/записи в /из критической секции - это нарушение семантики критической секции. Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю )) Но к сожалению, у меня нет времени сейчас вникать в это и разбираться. Выделенное - абсолютно не верно, это азы многопоточного программирования. Ну дело ваше не верить стандарту C++11, ассемблеру генерируемому компиляторами gcc/clang/icc/msvc и документации Intel IA64, кто не разобрался - тому остается только верить во что-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 14:27 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинВыделенное - абсолютно не верно Ну, наверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 15:16 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxвроде бы общепринято, что для spin-lock достаточно acquire/release семантики: acquire RMW - вход в критическую секцию, release store - выход. Положим, что spin-lock защищает секцию, в которой мы только что-то сохраняем: Код: plaintext 1. 2. 3. 4. Anatoly MoskovskyВася Уткинтакое переупорядочивание не нарушает критические секции, но позволяет их очень сильно оптимизировать Любой вход /выход чтения/записи в /из критической секции - это нарушение семантики критической секции. Поэтому я пока не верю, вышеприведенным картинкам. А вот многолетней практике спинлоков в SMP - верю )) Но к сожалению, у меня нет времени сейчас вникать в это и разбираться. Anatoly MoskovskyСтранно, я всегда думал что через load/store совмещенный с seq_cst компилятору нельзя двигать операции в обе стороны (так же как и через release/acquire в одну сторону ), иначе например мьютекс не будет работать. Я же вижу вы сами все прекрасно знаете :) Т.е. для spin-lock достаточно acquire/release, к тому же через release/acquire нельзя двигать операции в одну сторону, тогда у меня вопрос к вам, в какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 18:33 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, Я вижу, что вы очень хорошо понимаете 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 я тоже не осмеливаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 00:07 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxскорее всего пункт 2 Уточнение: нумерация начинается с единицы ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 00:11 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася Уткинв какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :) Наружу точно нельзя. А внутрь двигать это хамство - программисту лучше знать что должно быть внутри секции )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 00:25 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxВася Уткин, Я вижу, что вы очень хорошо понимаете memory ordering C++11. К сожалению, о себе я такого сказать не могу, - у меня типичный пример "бумажных знаний", когда вроде что-то знаешь, а применить на практике не можешь, либо можешь, но с большими сомнениями. Красиво затролили :) khizmaxВася УткинМогут быть переупорядочены: store(seq), store(relaxed) Для меня это тоже было неожиданно - переупорядочение через seq_cst. Перечитал первоисточники, - вроде все верно, действительно могут. Хм... Заметьте, ключевое слово здесь - "вроде", то есть я так до конца и не уверен, правильно ли я понял стандарт. Отсюда я делаю выводы: либо я плохо понимаю английский либо написано в стандарте все настолько математически строго и сжато, что требует немалого разжевывания и соотношения с реальностью либо я полный нуб (этого тоже исключать нельзя) Судя по тому, что я наблюдаю в инете и при личном общении, - скорее всего пункт 2. Возможно даже разработчики компиляторов не сразу поняли стандарт, судя по несуразным багам в некоторых компиляторах, в примерах из 1 операции: https://connect.microsoft.com/VisualStudio/feedback/details/770885 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 00:55 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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 в стандарт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 00:56 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВася Уткинв какую одну сторону нельзя двигать операции: 1.наружу или 2.внутрь крит секции? :) Наружу точно нельзя. А внутрь двигать это хамство - программисту лучше знать что должно быть внутри секции )) Обкладывайте критическую секцию снаружи std::atomic_thread_fence(std::memory_order_seq_cst); https://godbolt.org/g/CT89i5 ни одна муха не пролетит в неё, и увидите по изменению производительности - кому лучше знать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 01:34 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинА вы вообще не думали 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 обещаю :-) А про схемы можно и поподробнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 01:51 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
А например следующие 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. А тут описывается термин последовательная согласованность "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 ещё подумаю, в любом случае если и буду начинать то со статьи или мануала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 19:15 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
khizmaxПо поводу статей. А если взглянуть так: стандарт - набор аксиом. На любой аксиоматике, если она не противоречива, зиждется стройное здание теории - набор следствий (теорем), вытекающих из аксиом; в конце концов цепочка этих выводов приводит к утверждениям, которые легко претворять в жизнь и легко им следовать. Core guide for memory ordering, так сказать. Я имею ввиду, что кто-то может сказать, что в стандарте есть какая-нибудь бредовая гарантия, что, например: все обычные float-переменных упорядочены. Оно там где-то есть, где именно этот некий человек не помнит, ну а вы все просто плохо ищите А т.к. опровержения всех бредовых мыслей в стандарте конечно же нет, то таким людям никогда не докажешь что нет строго порядка у обычных float. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 19:16 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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 ни одна муха не пролетит в неё, и увидите по изменению производительности - кому лучше знать :) Ну, в С++ мьютексы реализованы через вызовы фукнций, а вызов функции, даже если она потом инлайнится, это барьер, так что через него муха точно не пролетит, по крайней мере при компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 19:45 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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-всех переменных? Есть цитата стандарта? :) Иначе все что вы писали в переменные до вызова этой функции так и останется в регистрах процессора надолго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2017, 20:29 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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, а высшую математику оставьте людям знающим... Обидно Почитал я все это - спасибо Васе Уткину за избранные цитаты из стандарта, - и понял, что моя идея насчет стройного здания теории на основе "аксиом" из стандарта, - полный бред. Вася Уткинесли и буду начинать то со статьи или мануала. Начинать надо, и не затягивайте, удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 00:20 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
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. Это легко и безопасно, а вы говорите мрак ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 01:28 |
|
||
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#18+
Вася УткинВы имеете ввиду, что вызов любой функции в C++ инициирует spilling-всех переменных? Есть цитата стандарта? :) Не думаю что в стандарте упомянуто слово spilling ))) Поищу про барьер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 12:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018235]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
144ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 356ms |

| 0 / 0 |
