2014-01-24 4 views
1

Я хочу сделать монитор, который синхронизирует n потоков в C следующим образом: Каждый поток вызывает методбарьерный_synch(). Первые n-1 потоки, которые называют этот метод sleep. Когда 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, это не кажется широким. «Как я могу написать свою ОС в выходные?» является широким. Это кажется весьма специфическим, хотя и нетривиальным. – Duck

+0

Это слишком широкий, потому что он спрашивает, правильный ли его код. @ Константинос Константини, пожалуйста, предоставьте более конкретный вопрос, попробовав свой код и спросив о конкретной проблеме. –

ответ

0

Отъезд The Little Book of Semaphores для всех видов примитивов синхронизации и использования. Это не в C, но это должно помочь вам правильно подумать о своем коде.