문제

말하자 나는 콘테이너(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 에서 링크를 제공하는 다른 응답자.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top