|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Вопрос по многопоточности18.07.2025, 22:33. Показов 15004. Ответов 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
Управление потоками в многопоточности Нужна информация о многопоточности |
|
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
|
|
| 14.08.2025, 20:54 | |
|
как вообще можно велосипеды писать, когда в С++ столько вкусных функций https://en.cppreference.com/w/cpp/atomic.html ?
0
|
|
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 14.08.2025, 23:43 | |
|
Royal_X, ну сделайте с этими недоделанными вкусностями работу с NUMA, привязку потоков к ядрам процессоров, приоритеты потоков и пр.
Пока вы пишите простое десктопное приложение - вам хватит и стандартных "вкусностей", а потом вдруг появится задача где не только велосипеды придётся писать, но и колёса к ним проектировать. Всегда надо помнить что стандартная библиотека с++ это идеал кода, а ширпотреб, который кое-как подходит для большинства применений. Даже спин локи можно сделать по разному: простой спинер, спинер с гарантированной очерёдностью доступа, к каждому из них можно добавить стратегию "back-off", чтобы потоки не долбились атомарными операциями в одну ячейку памяти.
0
|
|
|
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
|
|||
| 14.08.2025, 23:57 | |||
|
согласен с вами, но мне очень далеко до тех задач, когда нужно самому реализовать что-то, что должно быть круче библиотечных функций.
0
|
|||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|||
| 15.08.2025, 00:05 | |||
|
0
|
|||
| 15.08.2025, 00:44 | |||||||||
|
Кликните здесь для просмотра всего текста
0
|
|||||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 15.08.2025, 00:52 | |
|
между строками 4 и 8 другой поток может захватить спиннер
0
|
|
|
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
|
|
| 15.08.2025, 01:35 | |
|
Igor3D, condition устанавливается без мьютексов или атомарных операций. Несколько потоков одновременно могут увидеть condition = 0 и войти в критическую секцию. Возможен захват спиннера после выхода из цикла, но до входа в критическую секцию. Ещё нет барьеров памяти, полагаю, что нужен memory_order_acquire. В любом случае библиотечных функций достаточно для решения этой проблемы.
0
|
|
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 15.08.2025, 08:28 | |
|
Royal_X, и ваш код превратисля из спинлока в обычный современный библиотечный мьютекс, который кстати делается на фьютексах https://github.com/eliben/code... -futex.cpp
какой смысл делать спинлок, если вы вызываете ОС в цикле std::this_thread::yield(); ?
0
|
|
| 16.08.2025, 12:57 | |||||||
Royal_X, конечно Вы не обязаны что-то писать, но если, как Вы говорите, std:: так уж хорош и самодостаточен, то почему бы не показать его богатырскую силу на 5 строчках простого кода? Ладно, попробую я
Вместо этого есть простой и хороший способ захвата: CAS, говорят также "идиома CAS". На уровне процессора гарантируется что condition будет установлено (конкретно в 1 в нашем случае) только если его текущее значение = заданному (у нас = 0). Таким образом если 2 или более потоков выполняют этот код, то один (и только один) установит значение 1 и выскочит из while, т.е. этот поток захватит спиннер, остальные останутся крутиться в цикле пока захватчик не обнулит condition. В общем, утверждение типа "спиннер что-то читает в цикле" неверно, правильно сказать "спиннер пытается писать в цикле", удачная запись означает захват. Справедливости ради надо сказать что упереться рогом и обойтись без CAS все-таки можно, но это опасно для Ваших психики/здоровья, а практический эффект почти нулевой. Ладно, поехали дальше. Мы ведь хотели не просто спиннер, а рекурсивный. Какие есть мысли?
0
|
|||||||
| 16.08.2025, 13:10 | |
|
Не по теме: Igor3D, я не пишу код ради написания кода. Напиши прикладную задачу, а я напишу код. Имею в виду, не говори мне, как реализовать внутренне. Рекурсивный или куерсивный, я сам решу. Ты пиши задачу, а я сам решу, что использовать, а что нет.
0
|
|
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 16.08.2025, 13:55 | |
|
Если мне не изменяет память то была научная работа где доказывалось что CAS является минимально необходимой аппаратной функцией процессора или какого либо блока системы для обеспечения синхронизации потоков.
0
|
|
|
фрилансер
6461 / 5664 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
|
|
| 16.08.2025, 14:01 | |
|
Igor3D, рекурсивный мьютекс - это дикий антипаттерн. Зачем пытаться его сделать?
0
|
|
| 16.08.2025, 20:14 | |
|
Вот 3 последних ответа. Первый - человек впадает в амбицию и злобно тыкает
Второй - упоминание о научной работе (видимо серьезной). Третий - это ж антипаттерн, мол, так вообще делать не нужно. В общем, что угодно - лишь бы не работать. Зачем? Зачем прилагать такие усилия чтобы отмазаться от написания несчастных 5 строчек кода? Может проще и лучше их взять да написать, а потом уже можно и покалякать "насколько это нужно/хорошо"?
0
|
|
|
фрилансер
6461 / 5664 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
|
|
| 16.08.2025, 20:41 | |
|
0
|
|
|
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
|
|
| 17.08.2025, 16:23 | |
|
"рекурсивный мьютекс - это дикий антипаттерн"
А в плюсах традиция тащить антипттерны в std?
0
|
|
|
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
|
|
| 17.08.2025, 16:54 | |
|
abit, в std много чего есть такого, что не нужно использовать, например, https://en.cppreference.com/w/... /atoi.html
Программисту дан мозг, чтобы думать, что использовать, а что нет, а не тупо использовать все, что есть в std. Некоторые функции в std для использования на свой страх и риск для отдельных извращенных сценариев.
0
|
|
|
фрилансер
6461 / 5664 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
|
|
| 17.08.2025, 17:30 | |
|
abit, я примерно про него и говорил
![]() ещё есть goto ещё есть using namespace std ещё есть макросы ещё есть глобальные переменные много чего есть "интересного"
0
|
|
|
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
|
|
| 17.08.2025, 18:35 | |
|
Зато полезные фичи из boost можно по 20 лет настаивать...
0
|
|
|
фрилансер
6461 / 5664 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
|
|
| 17.08.2025, 20:28 | |
|
abit, кто пользуется полезными фичами из буста - может просто продолжить ими пользоваться
0
|
|
| 17.08.2025, 20:28 | |
|
Помогаю со студенческими работами здесь
100
изучение многопоточности Объясните принцип создания многопоточности Менеджмент жесткого диска при многопоточности Реализация многопоточности в консоли Сравнение многопоточности С++11 и WinAPI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|