2012-05-25 2 views
4

Согласно документации Boost, boost::mutex и boost::timed_mutex должны быть разными. Первый реализует Lockable Concept, а второй - TimedLockable Concept.Разница между boost :: mutex и boost :: timed_mutex

Но если вы посмотрите на источник, вы увидите, что они в основном то же самое. Единственное отличие - блокировка typedefs. Вы можете позвонить по телефону timed_lock по телефону boost::mutex или использовать boost::unique_lock с минимальным временем ожидания.

typedef ::boost::detail::basic_timed_mutex underlying_mutex; 
class mutex: 
    public ::boost::detail::underlying_mutex 

class timed_mutex: 
    public ::boost::detail::basic_timed_mutex 

В чем смысл этого? Это какой-то остаток прошлого, неправильно ли использовать boost::mutex как TimedLockable? В конце концов, это недокументировано.

+1

Так что, если один и тот же основной мьютекс * происходит * для реализации обеих концепций на * вашей * платформе. Они * позволяют * быть разными, но не * обязательными *! –

+0

@BoPersson: Да, я понимаю, но это не похоже на то, что получающаяся дополнительная функциональность скрыта в некотором «подробном» пространстве имен. Общественные методы являются правильными в открытом доступе. Я нахожу его нехарактерным для библиотек Boost. –

ответ

3

Я не смотрел на источник, но я использовал их несколько дней назад, и временные мьютексы функционируют по-разному. Они блокируются до тех пор, пока время не закончится, а затем вернитесь. Уникальная блокировка блокируется, пока она не сможет получить блокировку.

Блокировка попыток не блокируется, и затем вы можете проверить, имеет ли она право собственности на замок. Временная блокировка будет блокироваться в течение определенного времени, а затем вести себя как блокировка try, то есть прекратить блокировку, и вы можете проверить право собственности на блокировку.

Я считаю, что внутренне некоторые из различных блокировок буксировки являются typedefs для уникальной блокировки, поскольку все они используют уникальную блокировку. Здесь есть имена typedef, чтобы вы могли отслеживать, для чего используете разные, хотя вы можете использовать разные функции и путать код клиента.

Edit: вот пример приурочено замок:

boost::timed_mutex timedMutexObj; 
boost::mutex::scoped_lock scopedLockObj(timedMutexObj, boost::get_system_time() + boost::posix_time::seconds(60)); 
if(scopedLockObj.owns_lock()) { 
    // proceed 
} 

Для справки: http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock

Редактировать снова: чтобы обеспечить конкретный ответ на ваш вопрос, да, было бы неправильно использовать boost::mutex как TimedLockable, поскольку для этой цели предусмотрена boost::timed_mutex. Если они являются одним и тем же в источнике, и это недокументировано, это ненадежное поведение, и вы должны следовать документации. (Мой пример кода не использовался timed_mutex поначалу, но я его обновил)

+0

Я вижу, что мой ответ был опущен. Если это не отвечает на вопрос или если я ошибаюсь, объясните, как это сделать. – taz

+0

Мой главный вопрос - почему. –

Смежные вопросы