Я хочу сделать монитор, который синхронизирует 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);
}
Правильно ли этот код? Может ли кто-нибудь объяснить мне простыми словами, как работает этот механизм?
Это слишком широкий вопрос, например, сайт SO. –
@Jens Gustedt, это не кажется широким. «Как я могу написать свою ОС в выходные?» является широким. Это кажется весьма специфическим, хотя и нетривиальным. – Duck
Это слишком широкий, потому что он спрашивает, правильный ли его код. @ Константинос Константини, пожалуйста, предоставьте более конкретный вопрос, попробовав свой код и спросив о конкретной проблеме. –