2017-11-25 8 views
0

x 개의 스레드가 있고 목록이 비어 있지 않은 경우에만 링크 된 목록에서 요소를 제거해야합니다. 그러나 원하는 경우 언제든지 새 요소를 추가하기 위해 명명 된 파이프를 사용하기 때문에 목록이 비어있는 경우 해당 요소가 죽는 것을 원하지 않습니다. 내가 연결된 목록이 비어 있는지 확인하는 동안 문제가 발생했습니다. 하나의 요소에 내 스레드가 모두 들어있어 조건을 입력하면 두 번째 스레드가 프로그램을 중단시킵니다.스레드를 사용하여 연결된 목록에서 요소 제거

void threads(){ 
    while(1){ 
     if(isEmtpy!=1){ 
      pthread_mutex_lock(&mutex);  
      //work 
      pthread_mutex_unlock(&mutex); 
     } 
    } 
    pthread_exit(NULL); 
} 

내 뮤텍스 위치를 변경해야한다고 가정합니다.하지만 if 조건 앞에 입력하면 아무 일도 일어나지 않습니다. 물론 isEmpty 변수를 보호하기 위해 로크 이상, 이동

+0

세마포어를 사용하여 목록의 요소를 계산합니다. 루프 상단에서 기다립니다. 그런 다음 'isEmtpy'검사를 전혀 수행 할 필요가 없으며 폴링을 낭비하는 CPU 및 메모리 대역폭을 피할 수 있습니다. 요소를 목록에 추가 할 때마다 단위를 세미에 게시하십시오. –

+0

요소의 수가 스레드 수와 같은 경우 요소를 제거하지 않을까요? – Mike

+0

?? 스레드가 그들을 먹을 수있는만큼 빠르게 요소를 제거합니다. 한 번에 여러 항목이 추가된다는 것을 의미합니까? 한 스레드가 모든 항목을 목록에서 제거하기를 원하십니까? 다른 스레드를 불필요하게 유휴 상태로 두지 않겠습니까? 예 : 8 개의 스레드가 있고 3 개의 항목이 추가 된 경우 8 개의 스레드 중 하나를 선택하여 3 개의 항목을 모두 제거 하시겠습니까? 아니면 3 개의 스레드를 하나씩 제거 하시겠습니까? –

답변

0

isEmpty의 변경은 또한 임계 영역 내에서 발생한다

void threads(){ 
    while(1){ 
     pthread_mutex_lock(&mutex);  
     if(isEmtpy!=1){ 
      //work 
      isEmpty = hasElements(list) ? 0 : 1; 
     } 
     pthread_mutex_unlock(&mutex); 
    } 
    pthread_exit(NULL); 
} 

충분해야한다.

+0

리스트가 비어있는 경우 뮤텍스를 잠금 해제하지 않았기 때문에 그 작업을 수행하지 못했습니다. 이제는 else를 추가 했으므로 이제 작동합니다. 고맙습니다! – Mike