2010-07-12 4 views
2

오랜 시간 요청이 있고 "기본"(UI) 스레드에서 호출됩니다. 호출을 별도의 스레드로 옮길 계획입니다. 문제는 일부 스레드가이 스레드에서 힙에 생성된다는 것입니다 (주 스레드는이 포인터로 작업해야 함).С ++ 다른 스레드에서 생성 된 개체를 삭제하는 방법

질문 :

  1. 는 메인 스레드에서 '다른 스레드'객체를 삭제할 수 있습니까?
  2. "다른"스레드의 객체를 삭제하는 것이 좋습니다.

감사

+0

1. 예. 2. 어쩌면. –

+1

C++ 표준은 스레딩을 전혀 다루지 않으므로 보편적 인 대답이 없습니다. 컴파일러와 운영 체제에 알려 주시면 해당 환경에 대한 구체적인 대답을 제공 할 수 있습니다. –

답변

3
  1. 예.

  2. 상황에 따라 다르긴하지만 좋지는 않습니다. 알고리즘에 따라 필요한 것을하십시오.

다른 스레드에서 만든 개체를 삭제하면 개체 소멸자가 스레드 로컬 저장소에서 작동하는 경우에만 위험 할 수 있습니다. 이것은 수업 자료에서 언급되어야한다.

+2

AFAIK, thread-heap을 사용하여'new'와'delete'를 금지하는 C++ 표준에는 아무것도 없습니다. (실제로이 방법으로 작동하는 할당 자의 일부가 있습니다.) 그래서 나는 단일 단어 응답이 없다고 생각합니다.). –

+3

@Ben : 표준에는 스레드에 관한 내용이 전혀 없습니다. 현재 표준은 스레드가 없다고 가정합니다. – sbi

1

내가 조언하지는 않을지라도, 그렇게하지 못하도록하는 방법은 없습니다. shared_ptr 또는 유사한 객체 IMHO를 사용하는 것이 좋습니다.

1

안전하지만 경쟁 조건을 잊지 마세요. 다음과 같이 삭제하십시오 :

//someObj 

    if (someObj != null) 
    { 
     lock(); 
     if (someObj != null) 
     { 
      delete someObj; 
      someObj = NULL; 
     } 
     unlock(); 
    } 
+0

'자물쇠'는 누구이며, 그는 'someObj'로 무엇을하고 있습니까? – Christopher

+0

@Christopher : 그는 "뮤텍스 만들기, 객체를 누크하기 전에 잡아서 객체를 삭제 한 후 해제"를 의미했습니다. 또는 뮤텍스 대신 중요한 섹션. – SigTerm

+0

@Christopher 자물쇠로 i는 "일부 동기화 메커니즘 사용"을 의미합니다. SigTerm이 올바르게 설명했습니다. – Andrey

0

다른 스레드에서 삭제할 수 있습니다.
그러나 소유자를 항상 알고 있는지 확인하는 것은 프로그래머의 책임입니다. 또한 다중 스레드 환경에서는 다른 스레드가 여전히 개체에 액세스하려고하는 경주 조건이 없는지 확인해야합니다. 그러나 작성중인 스레드가 객체를 삭제할 때도 마찬가지입니다. 이 문제를 해결하는 좋은 방법은 공유 포인터/약점 포인터를 사용하는 것입니다. 부스트 shared_ptr은 스레드로부터 안전합니다

0

Boost's shared_ptr에서 살펴볼 수 있습니다. 그것은 쓰레드가 생성 된 것과 관계없이 자유로운 객체를 처리 할 것이고, 어떤 쓰레드가 어떤 객체를 가리키는지를 파악하는 번거 로움을 덜어 줄 것입니다. 그것은 또한 완전히 스레드 안전합니다 (당신은 여전히 ​​자신의 객체의 내부 동작을 보호해야하지만, 나머지는 당신을 돌볼 것입니다).

관련 문제