|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Вопрос по многопоточности18.07.2025, 22:33. Показов 19382. Ответов 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
Управление потоками в многопоточности Нужна информация о многопоточности |
|
Нарушитель
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,713
|
|
| 14.08.2025, 20:54 | |
|
как вообще можно велосипеды писать, когда в С++ столько вкусных функций https://en.cppreference.com/w/cpp/atomic.html ?
0
|
|
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
|
| 14.08.2025, 23:43 | |
|
Royal_X, ну сделайте с этими недоделанными вкусностями работу с NUMA, привязку потоков к ядрам процессоров, приоритеты потоков и пр.
Пока вы пишите простое десктопное приложение - вам хватит и стандартных "вкусностей", а потом вдруг появится задача где не только велосипеды придётся писать, но и колёса к ним проектировать. Всегда надо помнить что стандартная библиотека с++ это идеал кода, а ширпотреб, который кое-как подходит для большинства применений. Даже спин локи можно сделать по разному: простой спинер, спинер с гарантированной очерёдностью доступа, к каждому из них можно добавить стратегию "back-off", чтобы потоки не долбились атомарными операциями в одну ячейку памяти.
0
|
|
|
Нарушитель
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,713
|
|||
| 14.08.2025, 23:57 | |||
|
согласен с вами, но мне очень далеко до тех задач, когда нужно самому реализовать что-то, что должно быть круче библиотечных функций.
0
|
|||
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
|||
| 15.08.2025, 00:05 | |||
|
0
|
|||
| 15.08.2025, 00:44 | |||||||||
|
Кликните здесь для просмотра всего текста
0
|
|||||||||
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
|
| 15.08.2025, 00:52 | |
|
между строками 4 и 8 другой поток может захватить спиннер
0
|
|
|
Нарушитель
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,713
|
|
| 15.08.2025, 01:35 | |
|
Igor3D, condition устанавливается без мьютексов или атомарных операций. Несколько потоков одновременно могут увидеть condition = 0 и войти в критическую секцию. Возможен захват спиннера после выхода из цикла, но до входа в критическую секцию. Ещё нет барьеров памяти, полагаю, что нужен memory_order_acquire. В любом случае библиотечных функций достаточно для решения этой проблемы.
0
|
|
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
|
| 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
|
|
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
|
| 16.08.2025, 13:55 | |
|
Если мне не изменяет память то была научная работа где доказывалось что CAS является минимально необходимой аппаратной функцией процессора или какого либо блока системы для обеспечения синхронизации потоков.
0
|
|
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
|
|
| 16.08.2025, 14:01 | |
|
Igor3D, рекурсивный мьютекс - это дикий антипаттерн. Зачем пытаться его сделать?
0
|
|
| 16.08.2025, 20:14 | |
|
Вот 3 последних ответа. Первый - человек впадает в амбицию и злобно тыкает
Второй - упоминание о научной работе (видимо серьезной). Третий - это ж антипаттерн, мол, так вообще делать не нужно. В общем, что угодно - лишь бы не работать. Зачем? Зачем прилагать такие усилия чтобы отмазаться от написания несчастных 5 строчек кода? Может проще и лучше их взять да написать, а потом уже можно и покалякать "насколько это нужно/хорошо"?
0
|
|
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
|
|
| 16.08.2025, 20:41 | |
|
0
|
|
|
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
|
|
| 17.08.2025, 16:23 | |
|
"рекурсивный мьютекс - это дикий антипаттерн"
А в плюсах традиция тащить антипттерны в std?
0
|
|
|
Нарушитель
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,713
|
|
| 17.08.2025, 16:54 | |
|
abit, в std много чего есть такого, что не нужно использовать, например, https://en.cppreference.com/w/... /atoi.html
Программисту дан мозг, чтобы думать, что использовать, а что нет, а не тупо использовать все, что есть в std. Некоторые функции в std для использования на свой страх и риск для отдельных извращенных сценариев.
0
|
|
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
|
|
| 17.08.2025, 17:30 | |
|
abit, я примерно про него и говорил
![]() ещё есть goto ещё есть using namespace std ещё есть макросы ещё есть глобальные переменные много чего есть "интересного"
0
|
|
|
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
|
|
| 17.08.2025, 18:35 | |
|
Зато полезные фичи из boost можно по 20 лет настаивать...
0
|
|
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
|
|
| 17.08.2025, 20:28 | |
|
abit, кто пользуется полезными фичами из буста - может просто продолжить ими пользоваться
0
|
|
| 17.08.2025, 20:28 | |
|
изучение многопоточности Объясните принцип создания многопоточности Менеджмент жесткого диска при многопоточности Реализация многопоточности в консоли Сравнение многопоточности С++11 и WinAPI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|