2012-12-21 5 views
0

이미지 ++ 클래스는멀티 스레드 환경에서 struct 필드에 안전하게 액세스하는 방법은 무엇입니까? 내가 방문자가 C임을</p> <pre><code>struct _Visitors{ int totalNum; map<uintptr_t, Visitor*> visitorMap; }; </code></pre> <p>노트라는 이름의 구조체가

는 내가 지금

struct _Visitors* pVisitors = NULL; 

즉, 구조체 _visitors의 인스턴스에 대한 포인터를 가리키는 선언 I 하나의 주 스레드 t1, 두 개의 작업 스레드 t2 및 t3의 세 가지 스레드가 있습니다.

T1이 같은 것입니다 :

pVisitors = 새로운 _visitors();

while(true){ 
    if a new visitor v enters 
     //pthread_mutex_lock(mtx); 
     pVisitors->totalNum++; 
     visitorMap[v.getVid()] = &v; 
     //pthread_mutex_unlock(mtx); 
    } 

(T3)이 같은 것입니다 :

T2는이 같은 것입니다

while(true){ 
    if a new visitor v leaves 
     //pthread_mutex_lock(mtx); 
     pVisitors->totalNum--; 
     visitorMap.eraseAt[v.getVid()]; 
     //pthread_mutex_unlock(mtx); 
    } 

내가 구조체 _Visitors의 글로벌 인스턴스 데이터 경주를 가질 수 스레드 T1과 T2를 알고, 그래서 struct _visitors에서 totalNum 및 visitorMap 필드를 보호하기 위해 배타적 잠금 (mutex)을 추가하십시오.

내 질문은 : 배타적 잠금을 추가하여 구조체 _Visitors의 해당 필드를 보호하기에 충분합니까? 다중 프로세서가있는 SMP 아키텍처에서 실행하는 경우 내 프로그램이 어떤 조건에서도 데이터 경쟁에 직면하지 않을 것이라고 확신합니까?

+0

답변이 없지만 밑줄로 시작하고 대문자 (두 개의 밑줄이있는 이름)로 시작하는 이름은 구현에 예약되어 있습니다. 사용하지 마십시오. –

답변

0

귀하의 데이터가 뮤텍스에 의해 적절하게 보호되고 있다면 데이터 경합, SMP 아키텍처가 필요한 이유는 없습니다.

뮤텍스를 관리하는 방법에 의심의 여지가 있으면 valgrind를 사용하여 프로그램을 실행하는 것을 주저하지 마십시오. valgrind를 사용하면 데이터 경합을 감지하고 경고 할 수 있습니다.

+0

감사합니다. 데이터 경쟁이 있는지 여부에 대해서는 어느 정도 불확실성이 있습니다. 귀하의 대답은 제가 불확실성을 제거하는 데 도움이됩니다. –

+0

게다가, valgrind 괜찮습니다. 나는 그것을 꽤 오랫동안 사용 해왔다. –

관련 문제