监视同步线程的C中的源代码[关闭]

Posted

技术标签:

【中文标题】监视同步线程的C中的源代码[关闭]【英文标题】:Monitor source code in C that synchronizes threads [closed] 【发布时间】:2014-02-15 20:57:57 【问题描述】:

我想按照以下方式制作一个同步C中n个线程的监视器:每个线程调用barrier_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);

这段代码正确吗?谁能用简单的话解释一下这个机制是如何工作的?

【问题讨论】:

对于诸如 SO 之类的网站来说,这个问题太宽泛了。 @Jens Gustedt,这似乎并不广泛。 “我如何在周末编写自己的操作系统?”是广泛的。这似乎很具体,尽管并不重要。 这太宽泛了,因为他在问他的代码是否正确。 @Konstantinos Konstantini,请通过尝试您的代码并询问特定问题来提供更具体的问题。 他也在问它是如何工作的。当有人转储 600 行并询问它是否有效或是否良好时,他们会被发送到 Code Review 或诸如此类的地方。这基本上是一个功能。我们一直在回答这类问题。 【参考方案1】:

查看The Little Book of Semaphores 了解各种同步原语和用途。它不在 C 语言中,但它应该可以帮助您以结构化、正确的方式思考您的代码。

【讨论】:

以上是关于监视同步线程的C中的源代码[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

java 同步代码块与同步方法

线程的同步

java线程同步--同步代码块

java线程同步--同步方法

synchronized将任意对象作为对象监视器