簡體   English   中英

std :: timed_mutex :: try_lock *虛假失敗

[英]std::timed_mutex::try_lock* fail spuriously

通過try_lock* ,我的意思是try_lock()try_lock_for()try_lock_until() 根據cppreference ,這三種方法可能只是虛假地失敗。 以下內容引用了try_lock_for()的說明

try_lock() ,允許此函數虛假失敗並返回false即使在timeout_duration期間某個時刻互斥鎖未被任何其他線程鎖定也是如此。

我知道std::condition_variable及其背后的基本原理可能會發生虛假的喚醒。 但是,互斥量是什么情況?

根據: http//www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3209.htm

另一方面,有充分的理由要求編寫程序以容忍虛假的try_lock()失敗:

  1. 正如Boehm,Adve,“C ++並發內存模型的基礎”,PLDI 08所指出的那樣,在沒有虛假try_lock()失敗的情況下強制執行無數據爭用程序的順序一致性需要對try_lock上的lock()操作進行更強大的內存排序( ) - 兼容的互斥類型。 在一些架構上,顯着增加了無爭用互斥收購的成本。 這個成本似乎大大超過了禁止虛假try_lock()失敗的任何好處。
  2. 例如,如果實現無法獲取用於保護互斥鎖數據結構的低級鎖定,則它允許用戶編寫的try_lock()失敗。 或者它允許這樣的操作直接用compare_exchange_weak編寫。
  3. 例如,當引入調試線程時,它確保客戶端代碼保持正確,該調試線程偶爾獲取鎖,以便能夠從正在檢查或檢查的數據結構中讀取一致值。 從try_lock()失敗中獲取信息的任何代碼都會因為引入另一個純粹鎖定和讀取數據結構的線程而中斷。

來自C ++ 14章“30.4.1.2互斥體類型”

第16段:

即使沒有任何其他線程持有,實現也可能無法獲得鎖定。 [注意:這種虛假失敗通常不常見,但允許基於簡單比較和交換的有趣實現(第29條)。 -end note]實現應確保try_lock()在沒有競爭互斥獲取的情況下不會始終返回false

和第19段:

即使在沒有虛假失敗的情況下,在失敗后對狀態也知之甚少

並回答

我知道std :: condition_variable及其背后的基本原理可能會發生虛假的喚醒。 但是,互斥量是什么情況?

std::timed_mutex有時是在操作系統中沒有直接支持時使用std::condition_varible實現的。 與在GNU libstdc ++中一樣:

#if _GTHREAD_USE_MUTEX_TIMEDLOCK

...

#else // !_GTHREAD_USE_MUTEX_TIMEDLOCK

  class timed_mutex
  {
    mutex       _M_mut;
    condition_variable  _M_cv;
    bool        _M_locked = false;

  public:

    template<typename _Rep, typename _Period>
      bool
      try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
      {
        unique_lock<mutex> __lk(_M_mut);
        if (!_M_cv.wait_for(__lk, __rtime, [&]{ return !_M_locked; }))
          return false;
        _M_locked = true;
        return true;
      }

    template<typename _Clock, typename _Duration>
      bool
      try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
      {
        unique_lock<mutex> __lk(_M_mut);
        if (!_M_cv.wait_until(__lk, __atime, [&]{ return !_M_locked; }))
          return false;
        _M_locked = true;
        return true;
      }
  };

#endif

暫無
暫無

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

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