Добавление замков в класс по составу - PullRequest
1 голос
/ 16 августа 2010

Я пишу потокобезопасный класс на C ++. Все общедоступные методы используют блокировки (нерекурсивные спин-блокировки) . Частные методы без блокировки. Итак, все должно быть в порядке: пользователь вызывает публичный метод, он блокирует объект, а затем выполняет работу через приватные методы. Но я получил мертвую блокировку, когда публичный метод вызывает другой публичный метод. Я читал, что рекурсивные мьютексы плохи, потому что их трудно отлаживать. Поэтому я использую stdio C: открытый метод Foo () только блокирует объект и вызывает Foo_nolock () для выполнения всей работы. Но мне не нравятся эти методы _nolock (). Я думаю, что это дублирует мой код. Итак, у меня есть идея: я сделаю класс BarNoLock без блокировки и потокобезопасный класс Bar, который имеет только один член: экземпляр BarNoLock. И все методы Bar только блокируют этот член и вызывают его методы. Это хорошая идея или, может быть, есть лучшие образцы / практики? Благодарю. Обновление: я знаю о прыщах и мостах. Я спрашиваю о многопоточности, а не ООП.

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Я не уверен, почему рекурсивные мьютексы могут считаться плохими, см. Этот вопрос для обсуждения их.

Рекурсивная блокировка (Mutex) против нерекурсивной блокировки (Mutex)

Но я не думаю, что это обязательно ваша проблема, потому что критические разделы Win32 поддерживают несколько записей из одного потока без блокировки.Из doc :

Когда потоку принадлежит критическая секция, он может выполнять дополнительные вызовы EnterCriticalSection или TryEnterCriticalSection, не блокируя его выполнение.Это предотвращает взаимную блокировку потока при ожидании критического раздела, которым он уже владеет.Чтобы освободить свое владение, поток должен вызывать LeaveCriticalSection один раз для каждого входа в критическую секцию.Нет никакой гарантии относительно порядка, в котором ожидающие потоки получат право собственности на критическую секцию

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

1 голос
/ 16 августа 2010

Похоже, вы заново изобрели Pattern Bridge .Звучит отлично в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...