Thread-safe interface, Потокобезопасный интерфейс |
Здравствуйте, гость ( Вход | Регистрация )
Thread-safe interface, Потокобезопасный интерфейс |
Andrew Selivanov |
9.1.2008, 13:34
Сообщение
#1
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
Хотелось бы рассмотреть тему потокобезопасных интерфейсов, подробно описанную в http://www.cs.wustl.edu/~schmidt/PDF/locking-patterns.pdf
Проблема: Допустим мы имеем некоторый класс (интерфейс) и несколько функций внутри. Внутри каждой функции мы захватываем мутекс. Теперь, если мы вызовем одну такую функцию из другой, налицо будет deadlock. Решение: Разделить каждую функцию на две - первая будет открытой, вторая закрытой. Открытая функция будет захватывать мутекс и вызывать закрытую (в которой и будет находится основная логика). |
|
|
archimed7592 |
9.1.2008, 13:43
Сообщение
#2
|
Участник Группа: Участник Сообщений: 127 Регистрация: 27.12.2007 Из: Moscow Пользователь №: 56 Спасибо сказали: 0 раз(а) Репутация: 0 |
Решение №2: использовать рекурсивный мьютекс.
|
|
|
ViGOur |
9.1.2008, 13:55
Сообщение
#3
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
|
|
|
Andrew Selivanov |
9.1.2008, 13:59
Сообщение
#4
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
Решение №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 |
9.1.2008, 14:10
Сообщение
#5
|
Участник Группа: Участник Сообщений: 127 Регистрация: 27.12.2007 Из: Moscow Пользователь №: 56 Спасибо сказали: 0 раз(а) Репутация: 0 |
Это что за зверек? При повторной попытке блокирования тем же потоком он не блокируется, а просто увеличивается счётчик. При разблокировании уменьшается. Если счётчик равен нулю мьютекс свободен для блокировки любым потоком. однако (цитата из бумаги первого поста) Каюсь, бумагу не читал, но, IIRC, стандартный виндовый мьютекс изначально рекурсивный. В бусте есть рекурсивный мьютекс. Вообще говоря, не вижу, в чём будет заключатся оверхэд(увеличивание счётчика?).
|
|
|
Serik |
13.2.2008, 13:40
Сообщение
#6
|
Студент Группа: Участник Сообщений: 19 Регистрация: 1.2.2008 Пользователь №: 80 Спасибо сказали: 0 раз(а) Репутация: 0 |
Проблема: Допустим мы имеем некоторый класс (интерфейс) и несколько функций внутри. Внутри каждой функции мы захватываем мутекс. Теперь, если мы вызовем одну такую функцию из другой, налицо будет deadlock. Я делаю просто еще один параметр у методов, и явно указываю, нужно блокировать мутекс или нет. |
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:48 |