|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||||||
Spinlock c std::this_thread::yield01.01.2020, 16:17. Показов 4720. Ответов 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
|
|
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
|
||
| 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
|
|||
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
|
||
| 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 что делает? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|