|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Вопрос по многопоточности18.07.2025, 22:33. Показов 20675. Ответов 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
Управление потоками в многопоточности Нужна информация о многопоточности |
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
|||||||
| 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
|
|||||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
|||
| 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
|
|||||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 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
|
|||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
|||||
| 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,377
|
||
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|