用C语言监控同步线程的源代码

用C语言监控同步线程的源代码,c,synchronization,posix,mutex,barrier,C,Synchronization,Posix,Mutex,Barrier,我想制作一个监视器,按照以下方式同步C中的n个线程:每个线程调用barrier\u synch()方法。调用此方法睡眠的前n-1个线程。当第n个线程调用此方法时,所有休眠线程都将唤醒,然后所有线程继续执行,而屏障将返回到初始状态。这是我找到的一个解决方案: #include <pthread.h> #include <stdio.h> #include <stdlib.h> typedef struct barrier{ int n, count;

我想制作一个监视器,按照以下方式同步C中的n个线程:每个线程调用barrier\u synch()方法。调用此方法睡眠的前n-1个线程。当第n个线程调用此方法时,所有休眠线程都将唤醒,然后所有线程继续执行,而屏障将返回到初始状态。这是我找到的一个解决方案:

#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);
}
#包括
#包括
#包括
类型定义结构屏障{
int n,计数;
pthread_mutex_t mutex;
pthread_cond_t cond;
int阻塞;
}屏障;
无效屏障_init(屏障*bar,int n){
棒->n=n;
条->计数=0;
pthread_mutex_init(&bar->mutex,NULL);
pthread_cond_init(&bar->cond,NULL);
条->阻塞=1;
}
无效屏障\u同步(屏障*bar){
而(1){
pthread_mutex_lock(&bar->mutex);
如果(条->阻塞==1)中断;
pthread_mutex_unlock(&bar->mutex);
}
条->计数++;
如果(条->计数==条->n){
条->阻塞=0;
pthread_cond_广播(&bar->cond);
}
而(条->阻塞==1){
pthread_cond_wait(&bar->cond,&bar->mutex);
}
条->计数--;
如果(条->计数==0){
条->阻塞=1;
}
pthread_mutex_unlock(&bar->mutex);
}

这个代码正确吗?有人能用简单的话向我解释一下这种机制是如何工作的吗?

查看各种同步原语和用法。它不是用C语言编写的,但它应该可以帮助您以结构化的、正确的方式思考代码。

对于这样的网站来说,这个问题太宽泛了。@Jens Gustett,这似乎不宽泛。“我如何在周末编写自己的操作系统?”这是一个宽泛的问题。这看起来很具体,尽管不是琐碎的。这太宽泛了,因为他在问自己的代码是否正确@Konstantinos Konstantini,请提供一个更具体的问题,通过尝试你的代码并询问一个具体的问题。他还询问它是如何工作的。当有人转储600行并询问它是否有效或是否良好时,他们会被发送到代码审查或诸如此类的地方。这基本上是一个功能。我们一直在回答这类问题。