4 Şubat 2019 Pazartesi

std::lock_guard Sınıfı

Giriş
lock_guard çok basit bir arayüz sunuyor.

Constructor
Kullanımı şöyle. İçine bir mutex veriyoruz. Scope içinde mutex kilitlenir. Çıkarken bırakılır. lock_guard template ile çalıştığı için mutex yerine lock() metodu veren herhangi bir sınıf ile de çalışırdı.
void member_foo() {
  std::lock_guard<mutex_type> lock(this->my_mutex);
  ...
}
Eğer mutex yerine başka bir tip vermek istersek BasicLockable olmalıdır. Dolayısıyla şu kod derlenmez.
std::lock_guard<pthread_mutex_t> lock(...);
Diğer

1.Return Value Optimization (RVO)
Klasik kullanımı şöyledir
Some_resource var;
{
  std::lock_guard<std::mutex> lock(mut);
  var = shared_Var;
}
Ancak bu kod RVO'dan faydalanmamızı sağlamaz. Şöyle yaparız.
// use an immediately-invoked temporary lambda
Some_resource var {
  [&] {
    std::lock_guard<std::mutex> lock(mut);
    return shared_var;
  } () // parentheses for invoke
};

2.Effective Modern C++ Item 16: "Make const member functions thread safe" 
Şöyle.
class Widget {
public:    
  int magicValue() const
  {
    std::lock_guard<std::mutex> guard(m);  // lock m    
    if (cacheValid) return cachedValue;
    else {
      auto val1 = expensiveComputation1();
      auto val2 = expensiveComputation2();
      cachedValue = val1 + val2;
      cacheValid = true;
      return cachedValue;
    }
  }                                        // unlock m    
private:
  mutable std::mutex m;
  mutable int cachedValue;                 // no longer atomic
  mutable bool cacheValid{ false };        // no longer atomic
};

Hiç yorum yok:

Yorum Gönder