varsayalım ben uyumsuz bazı kod çalıştırabilir bir sınıf var ve bu uyumsuz kod Açıkçası sınıf örneği bu erişimler için sırayla arka plan iş parçacığı daha uzun yaşamak gerekir, çağrı üye fonksiyonları gibi şeyler yapmak veri üyeleri, vb okumak için sınıf örneğini kullanır güvende olmak. Yıkıcıdaki arka plan iş parçacığına katılarak bunu sağlamak yeterli mi? Örneğin:Yıkıcıya katılarak eşzamansız çalışmayı beklemek güvenli midir?
#include <iostream>
#include <thread>
class foo final
{
public:
foo() = default;
void bar() {
std::cout << "Hopefully there's nothing wrong with using " << this << "\n";
}
void bar_async() {
if (!m_thread.joinable()) {
m_thread = std::thread{&foo::bar, this};
}
}
~foo() {
if (m_thread.joinable()) {
std::cout << "Waiting for " << m_thread.get_id() << "\n";
m_thread.join();
}
}
private:
std::thread m_thread;
};
int main() {
foo f;
f.bar_async();
}
Özellikle, object lifetime rules endişeleniyorum: destructor'ın yürütme başladığında
yıkıcı önemsiz değil sınıf türlerinin herhangi bir nesne için, ömür boyu biter.
... Bir nesnenin ömrü sona erdi ve sonra işgal nesne yeniden kullanılabilir veya serbest depolamadan önce, tanımsız olduğu nesneyi tanımlayan glvalue ifade aşağıdaki kullanım alanları: ...
- Statik olmayan bir üye üyeye veya statik olmayan üye işlevine yapılan çağrıya erişim.
Ama bana göre yukarıda sıkı bir okuma da ~foo()
içinden this->bar()
arayarak doğrudan "Açıkçası" hangi durumda değil, tanımsız olduğu anlamına geliyor.
'Final' bir çok problemi çözüyor; Eğer final değilsen son derece dikkatli ol. – Yakk
Bu pratik veya yasal bir soru mu? – curiousguy
@curiousguy Legalistic –