스레드 안전 c ++ std :: 멀티 플레 스레드에서 추가, 제거 및 반복자를 지원하는 세트

StackOverflow https://stackoverflow.com/questions/1404717

문제

나는 지원하는 세트 인 Java의 CopyonWriteset과 비슷한 것을 찾고 있습니다. add, remove 그리고 어떤 유형의 iterators 여러 스레드에서.

도움이 되었습니까?

해결책

내가 아는 것이 없다. 가장 가까운 것은 실 빌딩 블록에있다. concurrent_unordered_map

STL 컨테이너가 허용합니다 여러 스레드에서 동시 읽기 액세스 동시 수정을하지 않는 한. 종종 추가 / 제거하는 동안 반복 할 필요가 없습니다.

간단한 래퍼 클래스를 제공하는 것에 대한 지침은 제정신입니다. 나는 당신이 실제로 동시에 액세스 해야하는 방법을 보호하고 기본 std :: 세트에 '안전하지 않은'액세스를 제공하는 방법을 보호하는 아래 코드 스 니펫과 같은 것으로 시작합니다. 안전하지 않은 다른 방법. 필요한 경우 반복자를 획득하고 다시 넣을 수 있도록 액세스를 보호 할 수 있지만, 이것은 까다 롭습니다 (여전히 자체 잠금 무료 세트 또는 자신의 완전히 동기화 된 세트를 작성하는 것보다 적합하지 않음).

병렬 패턴 라이브러리에서 작업하므로 VS2010의 Critical_section을 사용하고 있습니다. Beta Boost :: Mutex도 훌륭하게 작동하며 Lock_Guard를 사용하는 RAII 패턴은이 작업을 선택하는 방법에 관계없이 거의 필요합니다.

template <class T>
class synchronized_set
{
    //boost::mutex is good here too
    critical_section cs;
public:
    typedef set<T> std_set_type;
    set<T> unsafe_set;
    bool try_insert(...)
    {
        //boost has a lock_guard
        lock_guard<critical_section> guard(cs);
    }
};

다른 팁

공유 뮤텍스를 사용하여 동시 액세스를 보호하지 않겠습니까? Raii를 사용하여 뮤텍스를 잠그고 잠금 해제하십시오.

{
   Mutex::Lock lock(mutex);
   // std::set manipulation goes here
}

여기서 MUTEX :: LOCK은 생성자의 MUTEX를 잠그고 파괴자에서 잠금 해제하는 클래스이며 MUTEX는 모든 스레드가 공유하는 MUTEX 객체입니다. Mutex는 사용중인 특정 OS 프리미티브를 숨기는 래퍼 클래스입니다.

나는 항상 동시성과 설정 행동이 직교 개념이라고 생각했기 때문에 별도의 클래스에있는 것이 좋습니다. 내 경험에서, 스레드 안전을 시도하는 수업은 그다지 유연하지 않거나 그다지 유용하지 않습니다.

불변량은 종종 데이터 구조에 대한 여러 작업이 필요하고 내부 잠금 장치 만 동시에 발생하는 단계 만 방지하는 반면, 인터 리빙과 다른 거시 작동의 단계를 유지해야합니다.

필요한 모든 스레드 안전 컨테이너가있는 ACE 라이브러리를 살펴볼 수도 있습니다.

내가 생각할 수있는 것은 병렬화에 OpenMP를 사용하고, STD에서 세트 클래스를 도출하고, 각 비판 세트 작업 주위에 쉘을 넣는 것입니다.

QT의 QT는 암시 적 공유 (쓰기 시맨틱에 대한 복사) 및 std :: set과 유사한 메소드를 사용합니다. 구현을 볼 수 있습니다. QT는 lgpl입니다.

쓰기 안전 및 서기 시맨틱에 대한 사본은 동일하지 않습니다. 그 말 ...

실제로 복사 한 쓰기 시맨틱 후에 Adobe 소스 라이브러리는 copy_on_write 이 의미론을 인스턴스화하는 것에 추가하는 템플릿.

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