2010-03-03 3 views
1

내가 뭔가를 multithread하고 노력하고있어 내 프로그램을 설정하는 등의 구조/클래스 처리를 위해 각 스레드에 전달됩니다.삭제할 포인터는 무엇입니까?

이 클래스에는 일부 스레드가 데이터를 읽는 공통 배열을 갖는 배열에 대한 포인터를 보유하는 변수가 있습니다. 배열을 복제하는 대신 하나의 배열로 지시하는 각 함수에 포인터가 제공됩니다. 이러한 공통 배열은 주 프로그램에서 초기화 된 다음 클래스 배열의 변수가 해당 배열을 가리키고 다시 배열로 전달됩니다.

제 질문은 해당 배열을 종료하기 위해 delete 명령을 사용해야하는 레벨 (주 프로그램 또는 스레드)입니까? 또한, 내가 할 때 다른 포인터는 어떻게됩니까? 그들은 자동으로 삭제되거나 수동으로 추적해야합니까? 마지막으로 다른 스레드가 여전히 그것을 사용하는 동안 실수로 배열을 삭제하면 어떻게됩니까? 다른 스레드가 여전히 사용하고 배열을 삭제하면, 당신은 아마 정의되지 않은 동작, 안개 충돌을 얻을

-Faken

답변

1

감사합니다.

모든 작업자 스레드가 완료되면 주 스레드를 정리하는 것이 좋습니다.

또 다른 가능성은 공유 포인터를 사용하는 것입니다. 공유 포인터를 사용하면 리소스를 사용하지 않는 즉시 자동으로 리소스를 해제 할 수 있습니다 (공유 포인터에 대한 액세스를 보호해야 함 - MSVC 표준 라이브러리의 shared_ptr). 그것은 보호되어있다 automatically).

1

delete는 포인터를 수정하지 않지만 메모리를 사용할 수 없도록 지정합니다.

그래서 일부 메모리가 삭제되면이를 참조 할 수 없습니다. 이는 단일 포인터가 다중 포인터로 적용될 때와 마찬가지입니다.

참조 카운팅을 사용하는 공유 포인터를 사용하면 모든 포인터가 해제 될 때만 기본 메모리가 삭제됩니다. 예를 들어 공유 포인터가 스레드로부터 안전한지 확인해야합니다.

0

프로세스 (응용 프로그램) 내의 모든 변수가 스레드간에 공유되므로 스레드 로컬 저장소 (TLS)를 사용하지 않는 한 변수 또는 메모리에 대한 수정이 해당 스레드에 대한 액세스 권한이있는 모든 스레드에 적용됩니다.

어레이를 삭제 한 다음 어레이를 삭제하면 배열을 삭제할 때와 마찬가지로 코드의 어딘가에 다시 액세스 할 때와 같은 결과가 나타납니다 (대부분 액세스 위반으로 인해 충돌이 발생 함).

"어느 수준"문제에 관해서는, 나는 혼란을 피하기 위해 객체를 만드는 스레드에 의해 객체를 할당 해제하는 것이 더 좋다고 생각하고, 그러한 객체가 다른 스레드에 더 이상 필요하지 않도록해야합니다.

관련 문제