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ı.
1.Return Value Optimization (RVO)
Klasik kullanımı şöyledir
2.Effective Modern C++ Item 16: "Make const member functions thread safe"
Şöyle.
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ğer1.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