2016-09-19 7 views
0

뮤텍스 및 pthread와 관련하여 질문이 있습니다.pthread 뮤텍스를 사용하여 공유 리소스를 처리하는 방법

공유 플래그가있는 경우이를 호출 할 수 있습니다 (F1). 그리고 여러 스레드가 있습니다. 그러나 단 하나의 스레드 (T1) 만 플래그를 올리거나/수 있으며 다른 모든 스레드 (T2..Tn)는 상태를 읽거나 끌어옵니다.

플래그 F1이 새로운 값으로 설정 될 때 T1이 mutex_lock/mutex_unlock을 사용하면 충분합니까? 다른 모든 스레드도 mutex_lock/mutex_unlock을 사용해야합니까? F1에서만 상태를 읽으려고합니까?

Exemple1: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      if(F1) { 
       /* Do something */ 
      } 
     } 
    } 



Exemple2: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      if(F1) { 
       /* Do something */ 
      } 
      pthread_mutex_unlock(&lock); 
     } 
    } 

답변

1

단일 기록기 다중 판독기 관용구를 사용할 수 있습니다.

읽기 :

pthread_rwlock_rdlock(&rwlock); 

쓰기 :

pthread_rwlock_wdlock(&rwlock); 

사용 사례는 게시 된 예처럼 단순하다면, 당신은 원자 플래그를 포함하는 잠금 무료 버전을 고려할 수 있습니다.

1

pthreads 모델에서 판독기 도 동기화 작업을 수행해야합니다. 설명 된대로 독자와 작성자 모두 pthread_mutex_lock()/pthread_mutex_unlock() 쌍이 될 수도 있고 리더 블록 작성자 metalfox's suggestion 일 수도 있습니다.