일부 코드를 비동기 적으로 실행할 수있는 클래스가 있고 비동기 코드가 해당 클래스 인스턴스를 사용하여 멤버 함수 호출, 데이터 멤버 읽기 등을 수행한다고 가정합니다. 분명히 클래스 인스턴스는 이러한 액세스를 위해 백그라운드 스레드보다 오래 있어야합니다. 안전하다. 그것은 소멸자의 배경 스레드에 합류하여 이것을 보장하는 것으로 충분합니까? 예를 들어 :소멸자에 가입하여 비동기 작업을 기다리는 것이 안전합니까?
#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();
}
는 특히, 나는 object lifetime rules에 대해 걱정 : 소멸자의 실행이 시작되면
소멸자 사소한없는 클래스 유형의 객체에 대한는 수명이 끝납니다.
... 물체의 수명이 끝난 후 점유하고 개체를 재사용하거나 해제 저장 전에 미정되는 객체를 식별 glvalue 표현의 다음 용도 ...
- 비 정적 데이터 멤버에 대한 액세스 또는 비 정적 멤버 함수에 대한 호출.
는하지만 나에게 위의 엄격한 독서는 또한 ~foo()
내부에서 this->bar()
를 호출하면 바로 "분명히"사실이 아니다, 이는 정의되지 않은 것을 의미한다.
'최종'는 많은 문제를 해결합니다. 당신이 '최종'이 아니라면 극도로 조심하십시오. – Yakk
실용적 또는 법률주의적인 질문입니까? – curiousguy
@curiousguy Legalistic –