crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> 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  


Цитата(archimed7592 @ 9.1.2008, 13:43) *
Решение №2: использовать рекурсивный мьютекс.
Это что за зверек?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 9.1.2008, 13:59
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(archimed7592 @ 9.1.2008, 14:43) *
Решение №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  


Цитата(ViGOur @ 9.1.2008, 13:55) *
Это что за зверек?

При повторной попытке блокирования тем же потоком он не блокируется, а просто увеличивается счётчик. При разблокировании уменьшается. Если счётчик равен нулю мьютекс свободен для блокировки любым потоком.
Цитата(Andrew Selivanov @ 9.1.2008, 13:59) *
однако (цитата из бумаги первого поста)
Каюсь, бумагу не читал, но, IIRC, стандартный виндовый мьютекс изначально рекурсивный. В бусте есть рекурсивный мьютекс. Вообще говоря, не вижу, в чём будет заключатся оверхэд(увеличивание счётчика?).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Serik
  опции профиля:
сообщение 13.2.2008, 13:40
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 1.2.2008
Пользователь №: 80

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Andrew Selivanov @ 9.1.2008, 13:34) *
Проблема:
Допустим мы имеем некоторый класс (интерфейс) и несколько функций внутри. Внутри каждой функции мы захватываем мутекс. Теперь, если мы вызовем одну такую функцию из другой, налицо будет deadlock.


Я делаю просто еще один параметр у методов, и явно указываю, нужно блокировать мутекс или нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 21:26