|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Имеется несколько потоков-писателей. Каждый из них изменяет свои переменные и тут все нормально. Писатели уже пишут. Имеется несколько потоков-читателей. Каждый из них имеет доступ и может читать любые переменные. Я уже почитал инет. Имхо, здесь ничего не нужно и все проблемы с совместным доступом к памяти решаются на уровне железа. Так ли это? Вроде, есть угроза, что переменная будет где-то в кэше. Так в следующем цикле я ее правильно прочитаю, не вопрос, вроде? Или нет? Типы данных, в основном, структуры и векторы. 2. Стоит ли в потоке считывать переменные один раз, создавать свои копии переменных, и работать уже с ними? Еще ничего не делал, в смысле потоков-читателей, хочу выяснить заранее, чтобы не нарваться.) "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 00:04 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Отсутствие thorn read на интеловской архитектуре железом гарантируется только до ширины шины данных, т.е. 32 бита на 32 битных платформах и 64 бита на 64-х. Всё. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 01:15 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 01:48 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA 2. Стоит ли в потоке считывать переменные один раз, создавать свои копии переменных, и работать уже с ними? Стоит на прикладном уровне кода для работы потока приготовить отдельные переменные. Чтобы потом не блокировать и не синхронизировать. Тогда минимальное переключение контекста и максимальная параллельность\скорость. Если данные не разделить, тогда вопрос о нужности самого распараллеливания работ. Ну, либо всё уже решено в СУБД. Там каждому потоку коннект и работай себе параллельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 08:30 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy. В Java есть раздел - типо Потокобезопасные векторы. Классы другие, дописанные. Там внутри методов стоит синхронизация и защита от потоков. Но повторюсь, лучше разделить при входе в поток чем несколько потоков используют один вектор. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 08:32 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy. Мдя ((( На самом деле тема эта очень сложная, граблей там очень много и искать их очень сложно, особенно если не понимаешь как оно работает. Советую почитать Рихтера , хотя бы то что касается многопоточности. В простейшем случае используй мутексы . Это классика, камменты к коду из примера по ссылке Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Принцип такой: только один из потоков может заблокировать мутекс, остальные потоки если захотят так же получить общие переменные, то приостанавливаются и ждут пока не произойдет разблокировка. Т.е. в один момент времени с общими переменными работает один поток. Сами общие переменные обычные, такие же как при однопоточном выполнении. Т.к. остальные ждут, то надо минимизировать время на которое происходит блокировка, поэтому при необходимости можно сделать копию в локальную переменную, разблокировать и работать с копией. std::atomic использовать не советую пока не наступит понимание как это работает. Еще можешь погуглить lock-free алгоритмы, это готовые решения для многопоточной работы. Этого товарища почитай ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 08:41 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Еще такая книга есть: Энтони Уильямс. Параллельное программирование на С++ в действии . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 10:44 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Имеется несколько потоков-писателей. Каждый из них изменяет свои переменные и тут все нормально. Писатели уже пишут. Имеется несколько потоков-читателей. Каждый из них имеет доступ и может читать любые переменные. false sharing (когда core1 лезет по адресу A, а core2 лезет по адресу A+1, то скорее всего оба ядра попадут на одну cache-line (там же общий L2-cache у них). Они будут конкурентно перезаписывать одну и туже cache line, в итоге оба останутся БЕЗ кэша). можете тут послушать (с 6:30, там есть субтитры на англ.): ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 15:00 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
полудухОни будут конкурентно перезаписывать одну и туже cache line, в итоге оба останутся БЕЗ кэша). От этого может просесть производительность, но сами данные останутся корректными. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 15:03 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
полудух, есть решение и без мьютекса, типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Но это не проходит там, где нужна приостановка потока и ожидание. Уже нужно бесконечный цикл городить. Лень.) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 15:39 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA полудух, есть решение и без мьютекса, типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Но это не проходит там, где нужна приостановка потока и ожидание. Уже нужно бесконечный цикл городить. Лень.) ужос Почитай хотя бы эту книжку 22075920 . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 15:49 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA полудух, есть решение и без мьютекса, типа: ну и нахрена это флажковая демократия, когда есть мьютексы? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 16:14 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Dima T Но mutex и atomic изучаю.) С экземплами в инете плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 16:24 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Dima T Ужос в том что иногда несколько потоков параллельно будут отрабатывать это место Код: plaintext 1.
Но ты этого не понимаешь, т.к. книжки не хочешь читать, но уже изобретаешь велосипед с квадратными колесами. Используй std::mutex. Он тоже может возвращаться если данные заняты std::mutex::try_lock() ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 16:31 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Dima T Ужос в том что иногда несколько потоков параллельно будут отрабатывать это место А доки по mutex и anomic читаю. Только этим и занят. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 16:34 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Dima T Еще такая книга есть: Энтони Уильямс. Параллельное программирование на С++ в действии . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 17:15 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBAНикакого ужоса.)) "А втыкаешь - не работает." (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 19:07 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Представь два ядра процессора выполняющие этот код одновременно Ядро 1 Ядро 2if(flag) {return 1;}if(flag) {return 1;}// flag пока false// flag пока falseflag = true;flag = true; Когда такое случится, а оно когда-то случится, тут твоя прога даст неверный результат ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 21:39 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Dima T, Да, я понимаю, но в моем случае одновременно не будет. Хотя, уже сейчас, сижу заменяю bool на atomic<bool> job =false; И потом проверка в if - compare_exchange_strong Пусть будет.) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 22:29 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Dima T Еще такая книга есть: Энтони Уильямс. Параллельное программирование на С++ в действии . читать надо вот эту версию, 2019 года, 2 редакция там C++17 учтён правда на англ. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 22:58 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
тут ещё такой момент: YUBA Код: plaintext 1. 2. 3.
Код: plaintext 1. 2. 3.
надо делать конструкторах-деструкторах. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 09:31 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA Dima T, Да, я понимаю, но в моем случае одновременно не будет. Хотя, уже сейчас, сижу заменяю bool на atomic<bool> job =false; И потом проверка в if - compare_exchange_strong Пусть будет.) Для твоего случая есть std::atomic_flag и метод test_and_set() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 09:57 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
YUBA ...с совместным доступом к памяти решаются на уровне железа. Так ли это?... Как сказано выше - тема межпроцессного взаимодействия многогранна. По синхронизации можно выделить несколько отдельных кучек 1) классика жанра - объекты синхронизации. предназначены для синхронного доступа к данным. 2) применение всевозможных оптимизаций, на объектах синхронизации, дабы избежать тяжеловесные вызовы объектов синхронизации. без практики предыдущего пункта - лезть сюда не стоит. 3) построение архитектуры взаимодействующих потоков таким образом чтоб минимизировать конфликт операций в местах синхронизации данных. без практики в предыдущих пунктах - лезть сюда не стоит. 4) оптимизация на уровне всего софта с привязкой к архитектуре софта и самого железа. лезть сюда без практики в предыдущих пунктах - не стоит. ещё раз повторюсь - практика, практика, практика. Тогда станет понятно как оно бывает на самом деле. теоретически можно и нужно конечно же, чтоб не быть на месте обезьяны а использовать опыт ранее накопленный. книги уже прозвучали выше. как то так, удачи вам (круглый) ЗЫ обычные флаги, слипы - это самое худшие варианты в данной теме... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 11:51 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Все решено, и написано. Завтра пробовать буду, если время будет. Вечером опубликую конкретные решения в нетленку. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 22:46 |
|
Потоки. Разделяемые переменные.
|
|||
---|---|---|---|
#18+
Доступ к методу класса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Это уже работает. Доступ к данным: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Еще не доделано. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 15:56 |
|
|
start [/forum/topic.php?fid=57&msg=39924219&tid=2017476]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 409ms |
0 / 0 |