부 shared_ptr 컨테이너 질문
-
02-07-2019 - |
문제
말하자 나는 콘테이너(std::벡터)의 포인터를 사용하여 멀티 스레드 응용 프로그램.추가 새로운 포인터 컨테이너,코드가 보호를 사용하여 중요한 부분(부스트::mutex).모든 그리고 좋은 것입니다.코드할 수 있어야 하나를 반환의 이 포인터는 스레드에 대한 처리,하지만 다른 별도의 스레드를 선택할 수 있습 중 하나를 삭제하려면 이러한 점할 수 있는 여전히 사용 할 수있다.예를 들어:
thread1()
{
foo* p = get_pointer();
...
p->do_something();
}
thread2()
{
foo* p = get_pointer();
...
delete p;
}
그래서 thread2 삭제할 수 있습니다 포인터를 동 thread1 은 그것을 사용하고 있다.불쾌한입니다.
그래서 그 대신 사용하고 싶 컨테이너의 향상을 공유했습니다.IIRC 이러한 점이 있을 참조산,그래서 나는익 공유습니다 대신 원 포인터를 하나 제거에서 컨테이너지는 무료 그것은 마지막 때까지 사용의 그것의 범위가 있습니다.즉
std::vector<boost::shared_ptr<foo> > my_vec;
thread1()
{
boost::shared_ptr<foo> sp = get_ptr[0];
...
sp->do_something();
}
thread2()
{
boost::shared_ptr<foo> sp = get_ptr[0];
...
my_vec.erase(my_vec.begin());
}
boost::shared_ptr<foo> get_ptr(int index)
{
lock_my_vec();
return my_vec[index];
}
위의 예에서,당 thread1 얻는 포인터를 하기 전에 thread2 통화를 지울 것이다,가리키는 개체를 여전히 유효한가요?실로 삭제 될 때 thread1 완료되면? 참고에 대한 액세스를 글로벌 벡터가를 통해 중요한 섹션입니다.
내 생각에 이것은 어떻게 shared_ptrs 작동 하지만 내가 필요할 수 있습니다.
해결책
을 위한 스레딩의 안전성을 높일::shared_ptr 확인해야 합니다 이 링크.지 않는 guarantied 된다 안전하지만,많은 플랫폼에서 작동합니다.을 수정하는 std::벡터 안전하지 않습 AFAIK.
다른 팁
위의 예에서,당 thread1 얻는 포인터를 하기 전에 thread2 통화를 지울 것이다,가리키는 개체를 여전히 유효한가요?실로 삭제 될 때 thread1 완료되면?
하는 경우,예를 들어 thread1 얻는 포인터를 하기 전에 thread2,다음 thread2 기다려야 할 것이의 시작 부분에서 기능(기 때문에 잠금).So,yes,객체에 지적은 여전히 유효합니다.그러나,당신은 당신할 수 있는지 확인하려면 my_vec 비어 있지 않은에 액세스하기 전에 처음 요소입니다.
는 경우에,당신은 동기화에 액세스하는 벡터(로서 원래의 원 포인터를 제안),사용량은 안전합니다.그렇지 않으면,당신은 빠질 수있다 파울의 예 4 에서 링크를 제공하는 다른 응답자.