![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Andrew Selivanov |
![]() ![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Хотелось бы рассмотреть тему потокобезопасных интерфейсов, подробно описанную в Link
Проблема: Допустим мы имеем некоторый класс (интерфейс) и несколько функций внутри. Внутри каждой функции мы захватываем мутекс. Теперь, если мы вызовем одну такую функцию из другой, налицо будет deadlock. Решение: Разделить каждую функцию на две - первая будет открытой, вторая закрытой. Открытая функция будет захватывать мутекс и вызывать закрытую (в которой и будет находится основная логика). |
|
|
archimed7592 |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 127 Регистрация: 27.12.2007 Из: Moscow Пользователь №: 56 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Решение №2: использовать рекурсивный мьютекс.
|
|
|
ViGOur |
![]()
Сообщение
#3
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(archimed7592 @ 9.1.2008, 13:43) Link Решение №2: использовать рекурсивный мьютекс. Это что за зверек?
|
|
|
Andrew Selivanov |
![]()
Сообщение
#4
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(archimed7592 @ 9.1.2008, 14:43) Link Решение №2: использовать рекурсивный мьютекс. Действительно, однако (цитата из бумаги первого поста) "...Moreover, even if this File Cache implementation is strategized with a recursive mutex it will incur unnecessary overhead when it reacquires the mutex in bind." Хотя IMHO перерасход будет совсем небольшим... |
|
|
archimed7592 |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 127 Регистрация: 27.12.2007 Из: Moscow Пользователь №: 56 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(ViGOur @ 9.1.2008, 13:55) Link Это что за зверек? При повторной попытке блокирования тем же потоком он не блокируется, а просто увеличивается счётчик. При разблокировании уменьшается. Если счётчик равен нулю мьютекс свободен для блокировки любым потоком. Цитата(Andrew Selivanov @ 9.1.2008, 13:59) Link однако (цитата из бумаги первого поста) Каюсь, бумагу не читал, но, IIRC, стандартный виндовый мьютекс изначально рекурсивный. В бусте есть рекурсивный мьютекс. Вообще говоря, не вижу, в чём будет заключатся оверхэд(увеличивание счётчика?).
|
|
|
Serik |
![]() ![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 1.2.2008 Пользователь №: 80 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Andrew Selivanov @ 9.1.2008, 13:34) Link Проблема: Допустим мы имеем некоторый класс (интерфейс) и несколько функций внутри. Внутри каждой функции мы захватываем мутекс. Теперь, если мы вызовем одну такую функцию из другой, налицо будет deadlock. Я делаю просто еще один параметр у методов, и явно указываю, нужно блокировать мутекс или нет. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 6.8.2025, 20:23 |