|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Вопрос по многопоточности18.07.2025, 22:33. Показов 18059. Ответов 104
Метки concurrency (Все метки)
Здравствуйте, сейчас смотрю книги по многопоточности, возникло несколько вопросов. Почему-то слово "вопрос" нельзя полностью написать в заголовке.
1. Известно, что переменную bool (или int, неважно) может 1 раз записать только 1 поток, остальные только читают, зачем тогда делать её atomic? 2. Улетят ли вызовы notify_one/notify_all вникуда, если они много раз вызваны перед методами, которые ожидают cv? 3. Допустим, есть 5 потоков и есть общий вектор с огромным количеством элементов. Первый поток изменяет только элементы с идексами 0, 5, 10; второй поток - элементы с индексами 1, 6, 11; третий поток - элементы с индексами 2, 7, 12 и т.д. Правильно ли я понимаю, что переброска кэша и связанное с ним замедление программы все равно может происходить, потому что индексы, с которыми работает каждый поток, находятся по соседству? 4. Вот пример потокобезопасной очереди из книги Вилльямса. Зачем при сравнении head с tail в функции get_tail мы используем мьютекс, который тут же перестает блокироваться после того, как мы вышли из функции?
0
|
||||||
| 18.07.2025, 22:33 | |
|
Ответы с готовыми решениями:
104
Управление потоками в многопоточности Нужна информация о многопоточности |
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||
| 23.07.2025, 13:56 | |||||||
|
Кликните здесь для просмотра всего текста
А тут я вам приведу цитату из стандарта в своем вольном переводе:
Не по теме:
Нажимание рандомных клавиш на клавиатуре в попытке написать работающую программу? Или вы все же сначала теорию изучаете? Откуда вы вообще про какой-то поиск узнали и какие буквы нужно жмакать на клавиатуре? Почему вдруг на определенном этапе обучения вы решили "нахрен эту теорию, я все знаю, мне все понятно, ничего вы мне не докажете"?
1
|
|||||||
|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
|||||||
| 23.07.2025, 16:43 [ТС] | |||||||
|
А если вместо pop и push методы f1 и f2, и только 2 потока, первый поток вызывают f1, а второй f2, то нет никакой конкуренции и мьютексы уже не нужны, правильно (каждый метод вызывается не более чем одним потоком)?
0
|
|||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 23.07.2025, 17:11 | |||
![]()
1
|
|||
|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
|||||||
| 23.07.2025, 17:23 [ТС] | |||||||
|
Спасибо за объяснения и комментарии, кажется, почти все понял в этом вопросе. А если в очереди уже есть несколько элементов (например, добавились в конструкторе), а из метода push удалили последнюю строку tail = tail->next.get(); , то всё равно в get_tail нужен мьютекс? Строки
0
|
|||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 23.07.2025, 17:33 | ||
|
Это безотносительно мьютекса хвоста очереди, просто вам к размышлению.
0
|
||
| 23.07.2025, 23:58 | ||||||||
0
|
||||||||
| 24.07.2025, 15:00 | |||
|
Не по теме:
Но если стандарт не гарантирует этого, то и вы не можете, пока речь не заходит о конкретном компиляторе с конкретными опциями для конкретной платформы. Правда, это уже не имеет отношения к языку.
0
|
|||
| 24.07.2025, 19:17 | |||
|
Не по теме: Кстати в примере с поиском макс ожидал от Вас варианта 4. Но увы.. :(
0
|
|||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||
| 24.07.2025, 21:06 | |||||
|
Не по теме:
А отладку и поиск багов в говнокоде вы не считаете напрасным разбазариванием? std::mutex, нет необходимости знать его реализацию, все контракты прописаны в стандарте.Да и все реализации, написанные на с++ должны соответсвовать стандарту. И чего это вдруг вы про реализации заговорили? Реализацией не поделитесь? Добавлено через 7 минут
0
|
|||||
| 24.07.2025, 21:56 | ||||||||||
0
|
||||||||||
| 24.07.2025, 22:19 | ||||
|
Не по теме:
Но, это в любом случае будет медленно в таком виде.
0
|
||||
| 26.07.2025, 17:03 | ||||
"Гарантии дает только страховой полис". Я изучал эту ситуацию на Qt 4.5 с тамошними мутексами/атомиками. Вполне возможно с тех пор что-то изменилось, и мои выводы неточны/неверны, тем не менее я опираюсь на этот свой опыт.Думаю что правильно сделать theMax атомиком и использовать relaxed семантику, по крайней мере для первого чтения. Это выглядит как просто "чтение не атомика" (atomicity) из др нитки, накладных расходов быть не должно. В данном конкретном случае можно сделать еще лучше, да, пронести через CAS и обойтись без мутекса.
И да, я совсем не гордюсь тем что нарушаю стандарт и понимаю что "нарываться" не следует. Но в первую очередь надо заботиться о производительности и функционале, "а шуба подождет"
0
|
||||
| 26.07.2025, 18:16 | ||
|
Не по теме:
0
|
||
| 27.07.2025, 14:21 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
| 01.08.2025, 15:50 [ТС] | ||||||
|
5. Есть ли санитайзер для Windows, ищущий data race?
6. Иногда на Linux Address Sanitizer ловил ошибки, связанные с data race, которые должен ловить Thread Sanitizer. Правильно я понимаю, что нередко Address Sanitizer может поймать ошибки, связанные с многопоточностью (Thread Sanitizer) и что это не связанно с уникальностью тех учебных багов, с которыми я столкнулся? 7. В книге Вильямса есть пример очереди без блокировок, построенной на атомиках и подсчёте ссылок, когда push и pop из 5 строчек разбухают в 50. Часто ли встречаются на практике такие запутанные алгоритмы с подсчётом ссылок или этот код был показан как учебный пример? 8. Допустим, есть очередь, в которой есть задачи, которые надо распределять по потокам. Правильно я понимаю, что если время выполнения каждой такой задачи достаточно велико, то нет необходимости придумывать, как сделать очередь (или другую структуру) свободной от блокировок и от ожиданий? Правильно я понимаю, что необходимость кода, который свободен от блокировок и/или ожиданий возникает только тогда, когда задачи, которые выполняются каждым из потоков, выполняются за достаточно малое время и сопоставимы с временными затратами, которые расходуются на мьютексы и атомики? 9. Правильно я понимаю, что memory_order_seq_cst нужен либо для отладки кода, потому что самый простой и не допускает перестановку, либо для тех участков, которые не являются узким местом кода и нет смысла использовать memory_order_acquire / memory_order_release? 10. Правильно я понимаю, что memory_order_relaxed используется только в комбинации с memory_order_acquire / memory_order_release и / или memory_order_seq_cst и служит для оптимизации и ускорения кода? Сам по себе, без других семантик, он никакого смысла не несёт? 11. Вот пример кода для стэка без блокировок из книги Вилльямса. Правильно я понимаю, что aquire / release нужны только для того, чтобы позволить процессору и компилятору сдвигать команды с целью оптимизации и ускорения и в тоже время быть уверенным, что всё, что было до release, там и останется, как и всё, что оказалось после aquire не сдвинется выше? Надо только, чтобы в процессе оптимизации, выполняемой компилятором и процессором, не произошло сдвига строчек кода (машинных команд) вниз (для release) или вверх (для aquire).
0
|
||||||
|
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,367
|
||
| 01.08.2025, 16:07 | ||
|
0
|
||
| 02.08.2025, 01:02 | ||||||||
Также есть проблема "бригады" ниток, ее запуска/готовности В общем, "не берите тяжелого в руки и дурного в голову". Lock-free - это конечно очень интересное, заводное дело, но чисто практический результат ну.. скажем, выходит довольно скромным ![]() Добавлено через 3 минуты
0
|
||||||||
|
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
|
|||||
| 03.08.2025, 10:02 | |||||
|
cdcodecpp, тему полностью не читал, но кажется ты пытаешься выработать для себя какие-то рецепты(паттерны) и далее писать код, просто комбинируя их. Вот, например: В общем - это не особо работает. Для того, чтобы понять какие-либо инструменты/средства, тебе нужно сначала понять проблемы, которые эти средства решают. Это как минимум. Зачастую ещё и контекст применения(не связанный непосредственно с решаемыми проблемами) этих инструментов/средств большое значение имеет. Вот можешь для начала написать максимально просто - ни атомиков, ни мутексов и прочего. Дальше посмотри, работает ли оно, как работает и если не работает, то в чём причина. Далее поправляешь и повтор. Ну это если стоит цель научиться.
0
|
|||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 03.08.2025, 11:22 | |
|
0
|
|
| 03.08.2025, 19:13 | ||
|
0
|
||
| 03.08.2025, 19:13 | |
|
изучение многопоточности Объясните принцип создания многопоточности Менеджмент жесткого диска при многопоточности Реализация многопоточности в консоли Сравнение многопоточности С++11 и WinAPI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного.
1. Почему показания термометра заряжены целью?
Цель заложена в самом. . .
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
По ссылке 403. Не очень информативно такую ссылку постить.
Запись от Usaga размещена Сегодня в 06:46 . . .
|
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|