2016-08-01 1 views
1

스레드 저장이 아닌 데이터 구조가 있습니다. 다중 스레드는 두 가지 방법으로 해당 데이터 구조를 읽고 쓰고 있습니다. 아래 그림과 같이이 문제에 대한 나의 접근 방식은 unique_lock를 사용했다 (호출의 순서가 아니라 랜덤) :C++에서 여러 메서드에 걸쳐 잠금

struct test { 

    void func1() { 
    boost::unique_lock<boost::mutex> lock(_mutex); 
    // modify data-structure 
    } 


    void func2() { 
    boost::unique_lock<boost::mutex> lock(_mutex); 
    // modify data-structure 
    } 

    boost::mutex _mutex; 
} 

I하지만,이 코드를 한 번에 하나의 스레드가 데이터에 액세스 할 수 있는지, 뮤텍스는 두 메서드에서 공유되므로
그러나 어떻게 든 데이터 구조에서 버그가 발생하여 단일 스레드 테스트 케이스에서 재현 할 수없는 버그가 발생할 수 있습니다 ...

두 방법 모두에서 boost :: unique_lock을 사용해야합니까? 그런 다음

lock() 
unlock() 

으로 전화하십시오.

+0

대신 ['boost :: scoped_lock'] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost/interprocess/scoped_lock.html)을 사용하십시오. –

+2

이 경우에는'std :: mutex'와'std :: lock_guard'를 사용할 수도 있습니다. STL에있는 것을 위해 부스트를 사용할 필요가 없습니다 – alexeykuzmin0

+0

@JoachimPileborg이 경우 왜 다른 점이 있습니까? 'scoped_lock'은'unique_lock'에 의해 교체 가능해야합니다. – Jens

답변

0

설명 된대로 잠금 메커니즘이 버그의 원인이 아니 었습니다.
그런데, 실제로이었다) 임계 영역의 외부
제가

datastructure.empty() 

라고 때문에 이전 버전이 방법은 threadsave이었다.

스레드 살균제을 가리키는 "Kerrek SB"덕분에 그 결과로 나를 버그로 인도했습니다.