2013-01-07 80 views
2

boost::timed_lock用法的boost :: unique_lock的:: timed_lock

void wait(int seconds) 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

boost::timed_mutex mutex; 

void thread() 
{ 
    for (int i = 0; i < 5; ++i) 
    { 
    wait(1); 
    boost::unique_lock<boost::timed_mutex> lock(mutex, boost::try_to_lock); 
    if (!lock.owns_lock()) 
     lock.timed_lock(boost::get_system_time() + boost::posix_time::seconds(1));//<<<< 
    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
    boost::timed_mutex *m = lock.release(); 
    m->unlock(); 
    } 
} 

timed_lock

問題>我有問題要了解以下行:

if (!lock.owns_lock()) 
    lock.timed_lock(boost::get_system_time() + 
        boost::posix_time::seconds(1));//<<<< 

這是我的理解。假設lock.owns_lock()返回false,這意味着當前對象不擁有可鎖定對象上的鎖定。所以下一行將被執行。如果在指定時間過後,對象仍然無法獲得鎖定,則boost::timed_lock將返回false。所以下面的行會被執行?

std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 

這個想法是否正確?我認爲代碼的目的是確保如果對象具有鎖定,則執行上面的行。但根據我的理解(我猜是不正確的),上面的行總是運行!

問題在哪裏?

回答

3

你是對的,這個例子並不保證在執行受保護的代碼之前始終正確獲取鎖。

給出的例子下面的解釋:

上述程序傳遞升壓:: try_to_lock作爲第二個參數,以升壓:: unique_lock的構造函數。之後是否可以通過owns_lock()方法檢查是否已獲取互斥鎖。如果沒有 - owns_lock()返回false - 使用由boost :: unique_lock提供的另一個函數:timed_lock()等待一定的時間來獲取互斥鎖。給定的程序等待多達一秒,這應該是足夠多的時間來獲得互斥體。

該示例實際上顯示了獲取互斥鎖的三種基本方式:lock()等待,直到獲得互斥鎖。 try_lock()不會等待,但如果在調用時可用,則獲取互斥鎖,否則返回false。最後,timed_lock()會在給定的時間內嘗試獲取互斥鎖。與try_lock()一樣,成功或失敗由bool類型的返回值指示。

的作者似乎意識到了這個問題(假設的timed_lock返回值的文件),但沒想到再測試,如果已經獲得鎖需要(他們說這表現「等待了到一秒鐘,這應該是足夠多的時間來獲得互斥體「)。在您的理解


一個錯誤:

如果指定的時間已過和對象仍然無法獲得鎖後,然後升壓:: timed_lock將返回false。

這是不正確的。 timed_lock將'持續'嘗試獲取鎖定,但如果指定時間已過,則放棄。

1

你說得對。該示例沒有正確處理互斥鎖無法鎖定的狀態。如果仔細閱讀下面的示例,您會看到以下引用的內容:

上面的示例使用各種方法來說明boost :: unique_lock提供的一些功能。當然,這些功能的使用對於給定的場景並不一定有意義;在前面的例子中boost :: lock_guard的用法已經足夠了。這個例子是爲了展示boost :: unique_lock提供的可能性。

+0

我已經讀過那一行。我最初的理解是,這裏unique_lock的使用被過度殺死。儘管如此,我認爲代碼是不正確的,並且至少應該提供一個處理,如果仍然無法在一段時間後獲得鎖定,而不是直接將下一行代替。 – q0987

相關問題