Re[6]: внутренняя реализация std::mutex?
От: okman Беларусь https://searchinform.ru/
Дата: 17.05.18 18:09
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>while(lck.test_and_set(std::memory_order_acquire)) [b]// здесь, возможно, придется подождать!


Спинлок в такой имплементации — это вообще, как по мне, плохая идея.

Во-первых, постоянно теребить глобальную переменную с xchg/cmpxchg и блокировкой шины — не есть гуд
(bus traffic и все такое). Как минимум, тут надо применять стратегию не "test and set", а
"test test and set" + какую-то разгрузку в виде yield/pause/Sleep/etc.

Во-вторых, на однопроцессорной машине крутиться в спин-цикле бессмысленно, так как лок никто в
это время не освободит.

Ну и в-третьих, если между захватом и освобождением лока поток будет вытеснен, получится
очень некрасивая ситуация по отношению к другим потокам, которые ждут его освобождения.
Особенно если лок не гарантирует порядок захвата. Так легко и систему завесить, особенно если
такой спинлок применять где-нибудь в критических местах — драйверы, всякие системные
обработчики и т.д. Встречал на практике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.