如何在C中编写监视器代码?

时间:2010-09-30 03:54:46

标签: c unix semaphore

我需要在C中进行一些进程同步。我想使用一个监视器,我已经阅读了很多关于它们的内容。但是我一直无法找到如何在C中实现它。我已经看到它们用Java和其他语言(如C ++)完成,但我无法在C中找到示例。

我看过K& R并且那里没有例子。我浏览了Unix系统编程,通信,并发和线程,但无法在那里找到监视器实现。

这让我来到这里。我在哪里以及如何定义监视器?如何在其余代码中实现它?

/ *我在* nix环境中编码* /

2 个答案:

答案 0 :(得分:5)

我最近为一个项目做了这个,我实现的概念是让一个线程启动所有其他线程,然后使用信号量和互斥量来控制处理共享内存时的进程间同步问题。

在监视器设计模式的上下文中,监视器的概念是一种基本上可以隐藏相互错位的构造。这个概念在C ++ Boost中表达,但它在核心C ++或C中不存在。在C中处理这种类型的作业的方式是使用老式的互斥(二进制信号量)和信号量。您可以阅读有关此here的更多信息。

下面是一个初始化信号量和互斥量的基本方法,你可能需要做一些关于如何以及何时使用每个信号量的内容,因为这里有点长,但here是一个链接让你入门。

pthread_mutex_t myMutex;
sem_t mySemaphore;
int status;
    status = pthread_mutex_init(&myMutex, NULL);
    if(status != 0)
        exit_with_error("There was an Error Initalizing the Mutex\n");
    status = sem_init(&mySemaphore, 0, 0);
    if(status != 0)
        printf("There was an Error Initalizing the Semaphore\n");

答案 1 :(得分:2)

以上用于初始化信号量和互斥量的代码非常棒。下面是一个如何在多线程可能出错的程序中使用它的示例。

struct account{
        int balance;
        int finished;
        pthread_mutex_t mutex;
        pthread_cond_t deposit; 
};

static void init_account(struct account *act)
{
        act->balance = 0;
        act->finished = 0;
        pthread_mutex_init(&act->mutex,NULL);
        pthread_cond_init(&act->deposit,NULL);
}

static void deposit(struct account *act, int amount)
{
        pthread_mutex_lock(&act->mutex);
        fprintf(stderr, "Deposit:%d\n",amount);
        act->balance += amount;
        pthread_cond_broadcast(&act->deposit);
        pthread_mutex_unlock(&act->mutex);
}