5个哲学家抢叉子程序. 演示死锁
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
enum { N = 5 }; /* number of philosphers */
static HANDLE fork[N]; /* model forks as mutex semaphores */
void think(long n) {
printf("Philosopher %d is thinking\n", n);
Sleep(10);
printf("Philosopher %d is hungry\n", n);
}
void eat(long n) {
printf("Philosopher %d is eating\n", n);
Sleep(0);
}
long WINAPI philosopher(long n) { /* model philosophers as tasks */
for (;;) {
think(n); // first the philosopher thinks for a while
// after thinking the philosopher becomes hungry...
WaitForSingleObject(fork[(n + 1) % N], INFINITE); // get left fork
Sleep(0); /* yield让出 the CPU (simulate preemption ) 去掉这句就不会死锁了吗?*/
WaitForSingleObject(fork[n], INFINITE); // get right fork
eat(n); // got both forks, can eat for a while
ReleaseMutex(fork[(n + 1) % N]); // release left fork
ReleaseMutex(fork[n]); // release right fork
}
return 0;
}
main() {
int n;
for (n = 0; n < N; ++n) { /* create forks */
fork[n] = CreateMutex(NULL, // default security attributes
FALSE, // initially not owned/* not owned */
NULL); // unnamed mutex
if (fork[n] == NULL)
{
printf("CreateMutex error: %d\n", GetLastError());
return;
}
}
for (n = 0; n < N; ++n) { /* create philosophers */
int threadID;
CloseHandle(CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE)philosopher,
(LPVOID)n, // thread function arguments
0, // default creation flags
&threadID)); //thread identifier
}
scanf("%c", &n); /* wait for the user to press Enter */
return 0;
}
#include <stdlib.h>
#include <windows.h>
enum { N = 5 }; /* number of philosphers */
static HANDLE fork[N]; /* model forks as mutex semaphores */
void think(long n) {
printf("Philosopher %d is thinking\n", n);
Sleep(10);
printf("Philosopher %d is hungry\n", n);
}
void eat(long n) {
printf("Philosopher %d is eating\n", n);
Sleep(0);
}
long WINAPI philosopher(long n) { /* model philosophers as tasks */
for (;;) {
think(n); // first the philosopher thinks for a while
// after thinking the philosopher becomes hungry...
WaitForSingleObject(fork[(n + 1) % N], INFINITE); // get left fork
Sleep(0); /* yield让出 the CPU (simulate preemption ) 去掉这句就不会死锁了吗?*/
WaitForSingleObject(fork[n], INFINITE); // get right fork
eat(n); // got both forks, can eat for a while
ReleaseMutex(fork[(n + 1) % N]); // release left fork
ReleaseMutex(fork[n]); // release right fork
}
return 0;
}
main() {
int n;
for (n = 0; n < N; ++n) { /* create forks */
fork[n] = CreateMutex(NULL, // default security attributes
FALSE, // initially not owned/* not owned */
NULL); // unnamed mutex
if (fork[n] == NULL)
{
printf("CreateMutex error: %d\n", GetLastError());
return;
}
}
for (n = 0; n < N; ++n) { /* create philosophers */
int threadID;
CloseHandle(CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE)philosopher,
(LPVOID)n, // thread function arguments
0, // default creation flags
&threadID)); //thread identifier
}
scanf("%c", &n); /* wait for the user to press Enter */
return 0;
}