|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||||||
Spinlock c std::this_thread::yield01.01.2020, 16:17. Показов 4798. Ответов 30
Метки нет (Все метки)
Добрый день, не могу найти обоснование применения функции "уступить другим потокам" при реализации спинлока, хотя нечто подобное есть в релизации boost::detail::spinlock. Я набрался наглости сделать свою реализацию, потомучто моя интуиция подсказывает что она лучше. Но надо ещё всё это обосновать, а я даже не знаю откуда взять информацию. Собственно надо обосновать что после некоторого количества "долбёжек" уместно сделать паузу, и ещё лучше обосновать предел после которого надо делать паузу. Выбранный предел в 100'000 наверняка неоптимальный.
Или не стоит замарачиваться а взять boost::detail::spinlock, но он нормальный в плане производительности или это просто игрушка детская ? Вот моя реализация для случая когда спинлок требуется для синглтона:
Очень много радикальных суждений встречал по поводу спинлока и хочется написать код, который будет воспринят нормально другими разработчиками. Добавлено через 30 минут Небольшие огрешности были. Поправил.
0
|
|||||||||||
| 01.01.2020, 16:17 | |
|
Ответы с готовыми решениями:
30
С++ memory ordering: fetch_sub(acquire) и spinlock на основе atomic_flag (Энтони Вильямс "Мультитрид в действии")
std::string, std::fstream, ошибка кучи |
|
Любитель чаепитий
|
|||
| 01.01.2020, 18:45 | |||
|
0
|
|||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||||||||
| 01.01.2020, 19:13 [ТС] | ||||||||||||
|
1)Неохота всегда и везде цеплять boost, а в стандартной библиотеки его нет 2)В некоторых местах мьютекс не годиться так как нужен код noexcept Я постарался сделать свою версию очень близко похожею на бустовскую:
Для некоторых использование
0
|
||||||||||||
|
Любитель чаепитий
|
||
| 01.01.2020, 19:35 | ||
std::atomic из буста. она довольно компактная.https://www.boost.org/doc/libs... atomic.hpp единственный момент состоит в том, что там используется boost::detail::yield с параметром. но и его реализация достаточно небольшая, так что её можно тоже вырезать без особых усилий.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||
| 01.01.2020, 19:56 [ТС] | |||||||
И ещё надо nanosleep, которая совсем не noexcept
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.01.2020, 21:42 | |
|
Думаю лучше все таки уступать дорогу другим потокам вместо того что бы пытаться пробиться к ресурсу долгое время. Вы же не отдельные потоки программируете а саму программу в целом. А много потоков вам судя по всему нужно для ускорения. Так вот, что по вашему будет лучше, если один поток пытается захватить доступ к ресурсу делая много холостых оборотов занимая тем самым ядро "просто так", или лучше что бы он уступил дорогу другим потокам которые например могут вообще не ждать освобождения мьютекса и выполнять полезную работу? Даже если дорогу уступят потоку не из вашей программы то по идее не страшно. Возможно это приблизит следующую задачу из вашего приложения на шаг ближе к исполнению (тут уже надо смотреть конкретный планировщик задач)
Добавлено через 53 минуты С другой стороны если критическая секция маленькая (например, просто взять задачу из очереди) тогда думаю уступать не выгодно т.к мьютекс вот-вот будет свободен и не надо переключать контекст. Короче говоря наверное надо действовать по ситуации не пытаясь использовать один и тот же мьютекс на все случаи жизни
0
|
|
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 02.01.2020, 03:40 [ТС] | |
|
Интересно, а как получить native_handle() для основного потока ?
Добавлено через 1 час 25 минут С этим разобрался. Добавлено через 7 минут Но почему у меня timer_delete всё время возвращает код ошибки ? Как правильно пользоваться этой функцией, в случае когда надо остановить таймер ? Добавлено через 7 минут Извините, не в ту тему вопрос задал.
0
|
|
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
|
||
| 02.01.2020, 11:21 | ||
|
В моём понимании, спинлоком нужно блокировать очень короткие операции. Участки кода, которые выполняются долго должны блокироваться чем-то переключающим контекст и ждущим без загрузки ЦПУ, к примеру мьютексом. Если исходить из быстротечности кода внутри блокировок спинлока, то можно поступиться загрузкой ЦПУ на время ожидания блокировки, так как переключение контекста может занять времени больше чем ожидание освобождения спинлока. Вы вводите отдельный цикл с yield, который даёт искусственную задержку блокировки и при этом всё так же загружает ЦПУ.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 02.01.2020, 12:22 [ТС] | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 02.01.2020, 15:39 | |||||
|
у меня был такой случай: на мсдн есть страничка, где описывается как майкрософт рекомендует изготавливать спинлоки. и вот я взял эту рекомендуемую готовую к употреблению версию спинлока. а потом выполнил бенчмарки: сравнительные тесты между spinlock, std::mutex и std::recursieve_mutex. оказалось, что стандартные мутексы работают примерно с одинаковой скоростью. с учетом статистических погрешностей можно считать, что std::recursieve_mutex не уступает в скорости std::mutex (а я почему то думал, что он будет самым тяжелым) самым медленным же оказался spinlock. замена стандартного мутекса на виндузятную критическую секцию так же не дала никакого перфоманса. итого: стандартные std::mutex и std::recursieve_mutex итак уже оптимизированны по самый ни балуй. ну и нафига тогда нужны все эти что spinlock рекомендуемый майкрософт будет быстрее, чем std::mutex, однако ж оказалось это не так. с кучей замеров, и красивыми табличками: тесты дебаг версии, тесты релиз версий, тесты x86, тесты x64, тесты на виндовс, тесты на линукс, по большому счету никого не волнует решение со спинлоком работает эффективнее.
0
|
|||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||
| 02.01.2020, 16:02 [ТС] | |||
|
Добавлено через 2 минуты И можно ссылку на мсдн, где рекомендация по изготовлению есть ? Добавлено через 14 минут Я не имею времени делать нормальный бенчмарк, могу скинуть номер своей карты. Если скинете денег, то сделаю бенчмарк(шутка)
0
|
|||
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
|
||
| 02.01.2020, 16:41 | ||
|
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 02.01.2020, 17:20 [ТС] | |
|
Вообщем я понял что каждый считает свой спинлок единственно правильный, а если у когото по другому, то он должен иметь железные аргументы. Как в такой ситуации выполнять тестовые задания ума не приложу
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 02.01.2020, 18:09 | ||
|
По сути засыпающий спинлок это аналог обычного мьютекса +/- туда-сюда в зависимости от реализации. Оба смотрят если доступа нет - идут спать. Когда критическая секция мала то спинлок без засыпаний получается выгодным так как лучше покрутить "парочку" холостых итераций и захватить блокировку вместо того что бы идти спать переключая контекст в kernel space (переключение контекста дорогая операция). Это будет быстрее. С другой стороны если блокировка удерживается долго тогда есть смысл уступить. Потому что 100500 холостых итераций просто будут тормозить всю систему когда какая-то задача могла бы отработать сделав полезную работу. Вот исходя из этих соображений и нужно принимать решение какую реализацию использовать. Ну и конечно же будет круто делать бенчмарки и принимать взвешенное решение. Мало ли кто и где что-там наоптимизировал.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 02.01.2020, 18:16 [ТС] | ||
|
Я всётаки жду что мне hoggy скинет ссылку на рекомендацию по спинлокам от msdn. В данной ситуации наверно остаётся только аппелировать к чемуто авторитетному. Но если кто поделиться своим бенчмарком, то я буду рад. Я не имею возможности слишкои сильно увлекаться одним спинлоком.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 04.01.2020, 12:50 | ||
|
Сам спинлок реализуется ровно в три строчки, при помощи std::atomic_flag. Можно с yield, можно и без него. Лично я делаю с yield, т.к. он относительно недорогой, не усыпляет поток, и не факт, что потоки выполняются на разных процессорах. Добавлено через 26 минут Про "он относительно недорогой, не усыпляет поток" я, конечно, загнал
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 05.01.2020, 00:05 [ТС] | |
|
А как называется примитив синхронизациии где доступ к ресурсу не ведётся, а используется try_lock ?
Добавлено через 17 минут А как называется примитив синхронизациии где борьба за доступ к ресурсу не ведётся, а используется try_lock ?
0
|
|
|
Любитель чаепитий
|
|||
| 07.01.2020, 18:16 | |||
|
https://lwn.net/Articles/704843/
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 08.01.2020, 01:28 | |
|
0
|
|
| 08.01.2020, 01:28 | |
|
Помогаю со студенческими работами здесь
20
Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>... Перевод строк std::string, std::wstring в Unicode (String) This_thread::yield что делает? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
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. . . .
|