C++ 11'de, bir nesnenin kilitlenmeyen bir önbelleğini uygulamak için herhangi bir yolu var mıdır, bu birden çok iş parçacığından erişilebilecek güvenli midir? Önbelleğe bakıyorum hesaplama süper ucuz değil, aynı zamanda süper pahalı değil, bu yüzden bir kilit gerektiren benim durumumda önbellekleme amacı yenmek olurdu. IIUC, std::atomic
'un kilitsiz olduğu garanti edilmez.C++ 11'de kilitlenmeyen önbellek uygulaması
Düzenleme: Pahalı olmayan bir hesaplama yaptığından, aslında bir veya iki kereden fazla çalışıp çalışmadığını umursamıyorum. Ancak, tüm tüketicilerin doğru değeri almasını sağlamalıyım. Aşağıdaki naif örnekte, bu durum garanti edilemez çünkü bir iş parçacığı için m_val
başlatılmamış bir değer elde etmek mümkündür, çünkü m_alreadyCalculated
başka bir iş parçacığı kümesi true değerine ayarlanmış, ancak m_val
'un değerini henüz belirlememiştir.
Düzenleme2: Aşağıdaki yorumlar temel türlerde std::atomic
muhtemelen kilitlenmeyeceğine dikkat çekmektedir. Olması durumunda, m_alreadyCalculated
'un m_val
'un değeri ayarlanmadan önce true değerine ayarlanmasının mümkün olmadığından emin olmak için C++ 11'in bellek siparişini kullanmanın aşağıdaki örnekte doğru yolu nedir?
Sigara evreli önbellek örneği: Eğer uygulama bu lockfree yapabileceğini görmek için std::atomic<T>::is_lock_free()
veya std::atomic::is_always_lock_free()
kontrol edebilirsiniz olsa
class C {
public:
C(int param) : m_param(param) {}
getValue() {
if (!m_alreadyCalculated) {
m_val = calculate(m_param);
m_alreadyCalculated = true;
}
return m_val;
}
double calculate(int param) {
// Some calculation
}
private:
int m_param;
double m_val;
bool m_alreadyCalculated = false;
}
Bu sesler ne yaptığını tam olarak Oldukça özel bir uygulama gibi, std :: atomic 'in kilitli olması garantileniyor mu, yoksa sadece istediğiniz platform (lar) ve derleyicilerin (ler) üzerinde kilitlenmesini önemsiyor musunuz? – hyde
Her neyse, önbellek yararı çok küçükse, bir mutex kullanarak bu amacı bozar, o zaman bir spin kilit kullanarak muhtemelen mümkün olacaktır. – hyde
Kilitlenmemesi için std :: atomic'e ihtiyacım var. – Danra