|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Вопрос по многопоточности18.07.2025, 22:33. Показов 18253. Ответов 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
Управление потоками в многопоточности Нужна информация о многопоточности |
|
6353 / 3524 / 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
|
|||||||
|
6353 / 3524 / 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
|
|||||||
|
6353 / 3524 / 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
|
|||
|
6353 / 3524 / 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|