2012-05-25 81 views
4

根據Boost文檔boost::mutexboost::timed_mutex應該是不同的。第一個實施Lockable Concept,第二個 - TimedLockable Conceptboost :: 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

我還沒有看過源代碼,但幾天前我用過這些,並且定時互斥函數的功能不同。他們阻止,直到時間到了,然後返回。一個唯一的鎖會阻塞,直到它可以獲得鎖。

嘗試鎖定不會阻止,然後您可以測試它是否擁有該鎖定的所有權。定時鎖將在指定的時間內阻塞,然後表現爲嘗試鎖 - 即停止阻止,並且您可以測試鎖的所有權。

我相信內部的一些不同的增強鎖是獨特的鎖的typedefs,因爲他們都使用獨特的鎖定。 typedef名稱在那裏,以便您可以跟蹤您使用不同的名稱,即使您可以使用不同的功能並混淆客戶端代碼。

編輯:這裏是定時鎖的例子:

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

我的主要問題是爲什麼。 –

相關問題