我需要在C中进行一些进程同步。我想使用一个监视器,我已经阅读了很多关于它们的内容。但是我一直无法找到如何在C中实现它。我已经看到它们用Java和其他语言(如C ++)完成,但我无法在C中找到示例。
我看过K& R并且那里没有例子。我浏览了Unix系统编程,通信,并发和线程,但无法在那里找到监视器实现。
这让我来到这里。我在哪里以及如何定义监视器?如何在其余代码中实现它?
/ *我在* nix环境中编码* /
答案 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);
}