Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2012-11-30 22:31:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Задумался, а вот нафига в имплементации shared_ptr используется именно спин-лок, а не мютекс?

Подробнее. Конечно, по возможности shared_ptr использует атомарные операции над памятью, но если их нет, то вместо этого реализует критическую секцию через спин-лок.

Спин-лок, между прочим, достается из пула спин-локов посредством хеширования адреса чего-то там, например, объекта на который указывает shared_ptr, не суть. Но всего в пуле только-то 41 спин локов.

И теперь вопрос --- а почему ж не мютексы?

Испугались, что мютексы могут быть медленнее? Вот как бы возможный вариант, я как-то года два назад проверял и вдруг оказалось, как мне припоминается, что под линуксом мютексы медленнее спин-локов могут быть. Не разобрался и почему.

Испугались, что мютексы надо инициализировать, и не захотели заморачиваться изготовлением навороченных схем, гарантирующих, что они будут инициализированы ранее, чем использоваться?

Как-то всё это оставляет ощущение недоделанности, то ли библиотеки, то ли языка, то ли синхронизаций. Т.е. я-то сам себе могу позволить подобный код писать, но в принципе для подобных задач должно существовать каноническое решение.


(Добавить комментарий)


[info]spamsink@lj
2012-12-01 02:22 (ссылка)
Какова ожидаемая длительность критической секции в тактах процессора?

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2012-12-01 09:43 (ссылка)
не помню. надо б, по идее, повторить эксперименты еще раз, может что-то придумается.

а что для вас могло бы дать знание этой длительности?

(Ответить) (Уровень выше)


[info]yigal_s@lj
2012-12-01 12:33 (ссылка)
а, я сразу не понял вопроса.

критическая секция очень короткая, например, инкремент ячейки памяти. или декремент и проверка результата с ветвлением.

сколько там тактов процессора?

ежели память закеширована - видимо, единицы
если нет - под сотню

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2012-12-01 13:27 (ссылка)
Т.е. вероятность того, что взаимное исключение потребуется, низка, соответственно, стоимость loсk-unlock важнее, чем стоимость ожидания, да и та на многоядерной машине ничтожна, а на одноядерной потеря кванта CPU возможна лишь тогда, когда тред прервался внутри критической секции, т.е. конкретно между двумя командами, вероятностью чего пренебрегают.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2012-12-01 13:58 (ссылка)
я вроде это тестировал на варианте, когда несколько тредов интенсивно входят и выходят в одну и ту же крит. секцию. на однокорном процессоре. и удивлялся, что спинлок работал в целом быстрее, вроде бы.

с другой стороны, я б ожидал, что мютекс работает с той же скоростью, что и спин-лок, когда критическая секция не занята. Ну, может... какие-то потери из-за дополнительного call-ret вместо инлайна.

В общем, надо б это перетестировать, чтоб точно вспомнить, что там было в деталях.

(Ответить) (Уровень выше)