簡體   English   中英

如何正確使用boost :: timed_mutex和scoped_lock

[英]How to correctly use boost::timed_mutex and scoped_lock

我正在嘗試將timed_mutex與scoped_lock一起使用。 在遵循以下示例之前,我已經成功使用了scoped_lock,但是現在我似乎找不到辦法,無法正確理解boost文檔。

所需的行為如下:嘗試獲取x時間的scoped_lock,如果成功返回true,否則返回false。

目前我有:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

但是,當我嘗試查找(通過增強文檔或示例)此scoped_lock是否返回布爾值時,我什么也沒找到,或者找到了完全不同的方法來實現。

因此,我想知道哪種方法是正確的,它是如何工作的,也許還可以說明如何正確“閱讀” boost的文檔。

更新:

所以

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

if(scoped_lock.owns_lock()) {
    // exclusive code 
}

是否將創建一個互斥鎖,當我嘗試使用scoped_lock.owns_lock()進行鎖定時,它將嘗試在10毫秒內獲取鎖定(在這種情況下),如果時間到了並且未獲得鎖定,則返回false?

如果您查看文檔boost::timed_mutex::scoped_lock只是boost::unique_lock<timed_mutex>的別名:

class timed_mutex:
    boost::noncopyable
{
public:
    // ...

    typedef unique_lock<timed_mutex> scoped_timed_lock;
    typedef unspecified-type scoped_try_lock;
    typedef scoped_timed_lock scoped_lock;

    // ...
};

現在查看boost::unique_lock文檔 ,它顯示了確定您是否擁有鎖的兩種方法:

template<typename Lockable>
class unique_lock
{
public:
    // ...

    explicit operator bool() const noexcept;
    bool owns_lock() const noexcept;

    // ...
};

因此,您可以

if(scoped_lock) {
    // we have the lock, yay!
}

要么

if(scoped_lock.owns_lock()) {
    // we have the lock, yay!
}

順便說一句,unique_lock具有一個將相對時間作為chrono :: duration的構造函數,它可能比使用絕對時間更干凈。

編輯:給出此代碼:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex,
           boost::get_system_time() + boost::posix_time::miliseconds(10)); // <-- attempt to acquire mutex happens here!

if(scoped_lock.owns_lock()) {
    // exclusive code 
}

獲取互斥鎖的嘗試發生在構造鎖時,而不是在調用owns_lock() 是的,僅當您成功獲取互斥鎖后,排他代碼才會執行​​。 我不確定“返回假”是什么意思-此代碼不返回任何內容。 如果owns_lock()返回false,則說明您無法獲取互斥體並且無法運行獨占代碼,並且可以隨時將其與調用方進行通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM