두 개의 서로 다른 스레드에서 호출되는 객체가 있는데 두 객체 모두에서 호출 한 후 "delete this"로 자체를 파괴합니다.자체를 삭제하는 객체의 스레드 안전 구현
이 스레드 안전성을 구현하려면 어떻게해야합니까? thread-safe는 객체가 결코 정확히 한 번 파괴되지 않는다는 것을 의미합니다 (두 번째 콜백 이후 자체를 파괴해야 함). 이 또한 뮤텍스를 삭제 때문에,
class IThreadCallBack
{
virtual void CallBack(int) = 0;
};
class M: public IThreadCallBack
{
private:
bool t1_finished, t2_finished;
public:
M(): t1_finished(false), t2_finished(false)
{
startMyThread(this, 1);
startMyThread(this, 2);
}
void CallBack(int id)
{
if (id == 1)
{
t1_finished = true;
}
else
{
t2_finished = true;
}
if (t1_finished && t2_finished)
{
delete this;
}
}
};
int main(int argc, char **argv) {
M* MObj = new M();
while(true);
}
은 분명히 내가 개체의 구성원으로 뮤텍스를 사용하고 삭제를 잠글 수 :
나는 몇 가지 예제 코드를 만들었습니다. 반면, finested-flag가 설정된 뮤텍스 보호 영역 안에 "toBeDeleted"플래그를 설정하면 오브젝트가 전혀 삭제되지 않는 상황이 있는지 확실하지 않습니다. 스레드 구현은 어떤 경우에도 스레드 당 정확히 한 번 콜백 메소드가 호출되도록합니다.편집/업데이트 :
void CallBack(int id)
{
mMutex.Obtain()
if (id == 1)
{
t1_finished = true;
}
else
{
t2_finished = true;
}
bool both_finished = (t1_finished && t2_finished);
mMutex.Release();
if (both_finished)
{
delete this;
}
}
이가 안전한 것으로 간주 수 : 나는 콜백 (..)를 변경하면 어떻게 ? (mMutex가 m 클래스의 멤버입니까?)
뮤텍스를 공개 한 후에도 아무 멤버에게도 액세스하지 않으면 내가 생각하는 것처럼?!
자동 삭제 하시겠습니까? 왜이 객체는 그것을 사용하는 스레드에 의해 파괴되지 않을까요? –
개체를 삭제하는 것은 나쁜 생각입니다. –
이유는 두 가지입니다. 왜 스레드를 사용하여 스레드를 삭제할 수 없습니까? 1. 두 스레드는 서로를 알 수 없습니다. 2. 스레드가 외부 라이브러리에 속합니다. – IanH