我需要在C语言中进行一些进程同步操作。我想使用一个监视器,已经阅读了很多相关文章。然而,我无法找到如何在C语言中实现它的方法。我看到Java和其他类似C++的语言中有实现过,但是在C语言中找不到示例。
我查阅了K&R,里面没有示例。我浏览了Unix系统编程、通信、并发和线程等书籍,但是也找不到监视器(monitor)的实现方法。
这就是我问问题的原因。如何定义监视器?如何在代码中实现它?
/* 我正在* nix环境中编码 */
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");
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);
}
monitor dining_controller {
cond ForkReady[3];//clients queue here
boolean fork[3]={true};//availability of each fork
void get_forks(int pid) { //pid = client id number
int left = pid;
int right = (pid++) % 3;
//grant left fork
if (!fork[left]){ //if that fork isn't available
cwait(ForkReady[left]);//queue so others can enter monitor
}
fork[left] = false;// make fork unavailable when you get it
//grant right fork;
if (!fork[right]){ // if that fork isn't available
cwait(ForkReady[right]);//queue so others can enter monitor
}
fork[right] = false; // make fork unavailable when you get it
}
void release_forks(int pid){
int left = pid;
int right = (pid++) % 3;
// release left fork
if (empty(ForkReady[left])){ // no one is waiting for that fork
fork[left] = true; //make fork available
}
else{
csignal(ForkReady[left]);//awaken process in queue
}
//release right fork
if (empty(ForkReady[right])){ //no one is waiting for that fork
fork[right] = true; //make fork available
}
else {
csignal(ForkReady[right]);//awaken process in queue
}
}
}
void philosopher [k=0 to 2]{ //three philosopher clients
while (true) {
<think>;
get_forks(k);//request to enter monitor
<eat spaghetti>;
release_forks(k);//request to enter monitor
}
}