Boost :: mutex - возможно ли заблокировать его внутри одной функции класса и разблокировать в другой? - PullRequest
2 голосов
/ 19 августа 2011

Итак, у нас есть класс с функциями a и b. Поток one вызывает a, и никакой другой поток не может вызвать a или b, пока one не вызовет b. Значение thread one будет способно вызывать a, а затем a и ... и чем a, и хотя one не вызвал b другие потоки, которые хотят вызвать a или b стоять в ожидании. можно ли сделать такую ​​вещь с boost::mutex и как это сделать?

Ответы [ 4 ]

6 голосов
/ 19 августа 2011

Мьютекс не проблема;это замок.Самое простое решение - просто вызвать mutex::lock() и mutex::unlock() вручную и забыть о mutex::scoped_lock;в конце концов, вы не хотите, чтобы замок соблюдал область видимости.Проблема с этим является обычной;Вы, вероятно, хотите освободить блокировку в случае исключения.Одним из решений будет динамическое выделение mutex::scoped_lock и использование std::auto_ptr или boost::shared_ptr для управления им.(Как ни странно, ни boost::mutex::scoped_lock, ни std::lock_guard не являются подвижными, поэтому для передачи права собственности требуется динамическое распределение.)

3 голосов
/ 19 августа 2011

Имеет отдельные функции lock() и unlock().Сделайте мьютекс членом вашего класса, а затем вызовите эти соответствующие функции ... Хотя я бы нашел альтернативный подход - у вас могут быть всевозможные странные ситуации (скажем, поток, вызывающий a сбой?)

2 голосов
/ 19 августа 2011

Есть несколько способов сделать это.Либо у вас есть мьютекс в качестве атрибута базового класса, а затем наследует ваши рабочие объекты от него.Или отправьте ссылку на мьютекс каждому рабочему классу.

1 голос
/ 19 августа 2011

Это возможно.Просто позвоните boost::mutex::lock() из a и boost::mutex::unlock() из b.

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

...