Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Какую библиотеку посоветуете с потокобезопасными контейнерами?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39422196&tid=2018235]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 291ms |
| total: | 531ms |

| 0 / 0 |
