![](/img/trans.png)
[英]Difference between mutex.timed_lock(duration) and boost::timed_mutex::scoped_lock scoped_lock(mutex, duration)
[英]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.