2014-01-24 1 views
1

다음과 같은 방법으로 C에서 n 개의 스레드를 동기화하는 모니터를 만들고 싶습니다. 각 스레드는 barrier_synch() 메소드를 호출합니다. 이 메서드를 호출하는 최초의 n-1 thread입니다. n 번째 스레드가이 메서드를 호출하면 모든 수면 스레드가 깨어 난 다음 모든 스레드가 실행을 계속하는 반면 장벽은 초기 조건으로 돌아갑니다. 이것은 내가 찾은 해결책입니다 :스레드를 동기화하는 C의 모니터 소스 코드

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct barrier{ 
    int n, count; 
    pthread_mutex_t mutex; 
    pthread_cond_t cond; 
    int blocked; 
}barrier; 

void barrier_init(barrier *bar, int n){ 
    bar->n = n; 
    bar->count = 0; 
    pthread_mutex_init(&bar->mutex, NULL); 
    pthread_cond_init(&bar->cond, NULL); 
    bar->blocked = 1; 
} 

void barrier_synch(barrier *bar){ 
    while(1){ 
     pthread_mutex_lock(&bar->mutex); 
     if (bar->blocked == 1) break; 
     pthread_mutex_unlock(&bar->mutex); 
    } 
    bar->count++; 
    if(bar->count == bar->n){ 
     bar->blocked = 0; 
     pthread_cond_broadcast(&bar->cond); 
    } 

    while(bar->blocked == 1){ 
     pthread_cond_wait(&bar->cond, &bar->mutex); 
    } 
    bar->count--; 
    if(bar->count == 0){ 
     bar->blocked = 1; 
    } 
pthread_mutex_unlock(&bar->mutex); 
} 

이 코드가 맞습니까? 누군가가이 메커니즘이 어떻게 작동하는지 간단히 설명 할 수 있습니까?

+0

이것은 SO와 같은 사이트에 대한 질문과 같이 너무 광범위합니다. –

+0

@Jens Gustedt, 이것이 광범위하지 않은 것 같습니다. "주말 내내 어떻게 OS를 만들 수 있습니까?" 넓다. 이것은 사소한 일이긴하지만 매우 구체적으로 보입니다. – Duck

+0

코드가 정확한지 묻기 때문에 이것은 너무 광범위합니다. @ Constantinos Konstantini, 코드를 시도하고 특정 문제에 대해 질문하여보다 구체적인 질문을 제공하십시오. –

답변

0

모든 동기화 프리미티브 및 용도에 대해 The Little Book of Semaphores을 확인하십시오. C 언어가 아니지만 구조화되고 올바른 방식으로 코드를 생각하는 데 도움이됩니다.

관련 문제