以下代码参考《现代操作系统》英文第2版P127哲学家就餐问题例子程序,在windowsXP下使用VC6.0进行了实现,希望大家多提改正意见:
#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#define PHILO_NUM 5 /* how many philosophers */
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#define DELAY_THINK 500
#define DELAY_EAT 400
#define STRING_LEN 7
#define LEFT(i) (i+PHILO_NUM-1)%PHILO_NUM
#define RIGHT(i) (i+1)%PHILO_NUM
typedef struct
{
int i;
}INTEGER;
/* global variables */
int state[PHILO_NUM];
HANDLE h_mutex; /* Semaphore for exclusion */
HANDLE h_s[PHILO_NUM]; /* Semaphore for philosophers */
/* definition */
void philosopher(void* id)
{
DWORD wait_for_mutex;
DWORD wait_for_self;
int nid;
nid = ((INTEGER*) id)->i;
while(TRUE)
{
printf("Philosopher%d is thinking.../n", nid);
Sleep(DELAY_THINK);
/* He wants to eat. */
wait_for_mutex = WaitForSingleObject(h_mutex, -1);
state[nid] = HUNGRY;
if (state[nid] == HUNGRY && state[LEFT(nid)] != EATING && state[RIGHT(nid)] != EATING)
{
state[nid] = EATING;
ReleaseSemaphore(h_s[nid], 1, NULL);
}
ReleaseMutex(h_mutex);
wait_for_self = WaitForSingleObject(h_s[nid], -1);
printf("Philosopher%d is eating.../n", nid);
Sleep(DELAY_EAT);
/* He finishes eating. */
wait_for_mutex = WaitForSingleObject(h_mutex, -1);
state[nid] = THINKING;
if (state[LEFT(nid)] == HUNGRY && state[LEFT(LEFT(nid))] != EATING && state[RIGHT(LEFT(nid))] != EATING)
{
state[LEFT(nid)] = EATING;
ReleaseSemaphore(h_s[LEFT(nid)], 1, NULL);
}
if (state[RIGHT(nid)] == HUNGRY && state[LEFT(RIGHT(nid))] != EATING && state[RIGHT(RIGHT(nid))] != EATING)
{
state[RIGHT(nid)] = EATING;
ReleaseSemaphore(h_s[RIGHT(nid)], 1, NULL);
}
ReleaseMutex(h_mutex);
}
}
int main(void)
{
DWORD thread_ID;
DWORD wait_for_all;
HANDLE h_thread[PHILO_NUM];
INTEGER intNums[PHILO_NUM];
int i;
char str_name[STRING_LEN];
/* initializing... */
h_mutex = CreateMutex(NULL, FALSE, "mutex_for_state_array");
h_mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex_for_state_array");
memset(str_name, 0, STRING_LEN * sizeof(char));
for (i = 0; i < PHILO_NUM; i++)
{
sprintf(str_name, "philo%d", i);
h_s[i] = CreateSemaphore(NULL, 0, 1, str_name);
h_s[i] = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, str_name);
}
for (i = 0; i < PHILO_NUM; i++)
{
intNums[i].i = i;
h_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(philosopher), &intNums[i], 0, &thread_ID);
}
wait_for_all = WaitForMultipleObjects(PHILO_NUM, h_thread, TRUE, -1);
return 0;
}