#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 5
pthread_mutex_t mutexes[NUM_THREADS];
pthread_cond_t conditionVars[NUM_THREADS];
int
permits[NUM_THREADS];
pthread_t tids[NUM_THREADS];
void
pickup_forks(
int
philosopher_number) {
pthread_mutex_lock(&mutexes[philosopher_number%NUM_THREADS]);
while
(permits[philosopher_number%NUM_THREADS] == 0) {
pthread_cond_wait(&conditionVars[philosopher_number%NUM_THREADS], &mutexes[philosopher_number%NUM_THREADS]);
}
permits[philosopher_number%NUM_THREADS] = 0;
pthread_mutex_unlock(&mutexes[philosopher_number%NUM_THREADS]);
}
void
return_forks(
int
philosopher_number) {
pthread_mutex_lock(&mutexes[philosopher_number%NUM_THREADS]);
permits[philosopher_number%NUM_THREADS] = 1;
pthread_cond_signal(&conditionVars[philosopher_number%NUM_THREADS]);
pthread_mutex_unlock(&mutexes[philosopher_number%NUM_THREADS]);
}
void
* Philosopher(
void
* arg) {
int
philosopher_number;
philosopher_number = (
int
)arg;
pickup_forks(philosopher_number);
printf
(
"philosopher(%d) picks up the fork(%d).\n"
, philosopher_number, philosopher_number);
pickup_forks(philosopher_number+1);
printf
(
"philosopher(%d) picks up the fork(%d).\n"
, philosopher_number, (philosopher_number + 1) % NUM_THREADS);
printf
(
"philosopher(%d) starts eating \n"
, philosopher_number);
sleep(2);
printf
(
"philosopher(%d) finishes eating \n"
, philosopher_number);
return_forks(philosopher_number + 1);
printf
(
"philosopher(%d) put down the fork(%d).\n"
, philosopher_number, (philosopher_number + 1) % NUM_THREADS);
return_forks(philosopher_number);
printf
(
"philosopher(%d) put down the fork(%d).\n"
, philosopher_number, philosopher_number);
return
NULL;
}
void
* OddPhilosopher(
void
* arg) {
int
philosopher_number;
philosopher_number = (
int
)arg;
pickup_forks(philosopher_number + 1);
printf
(
"philosopher(%d) picks up the fork(%d).\n"
, philosopher_number, (philosopher_number + 1) % NUM_THREADS);
pickup_forks(philosopher_number);
printf
(
"philosopher(%d) picks up the fork(%d).\n"
, philosopher_number, philosopher_number);
printf
(
"philosopher(%d) starts eating \n"
, philosopher_number);
sleep(2);
printf
(
"philosopher(%d) finishes eating \n"
, philosopher_number);
return_forks(philosopher_number);
printf
(
"philosopher(%d) puts down the fork(%d).\n"
, philosopher_number, philosopher_number);
return_forks(philosopher_number + 1);
printf
(
"philosopher(%d) puts down the fork(%d).\n"
, philosopher_number, (philosopher_number + 1) % NUM_THREADS);
return
NULL;
}
int
main() {
int
i;
for
(i = 0; i < NUM_THREADS; i++) {
pthread_mutex_init(&mutexes[i], NULL);
pthread_cond_init(&conditionVars[i], NULL);
permits[i] = 1;
}
for
(i = 0; i < NUM_THREADS; i++) {
if
(i % 2) {
pthread_create(&tids[i], NULL, OddPhilosopher, (
void
*)(i));
}
else
{
pthread_create(&tids[i], NULL, Philosopher, (
void
*)(i));
}
}
for
(i = 0; i < NUM_THREADS; i++) {
pthread_join(tids[i], NULL);
}
for
(i = 0; i < NUM_THREADS; i++) {
pthread_mutex_destroy(&mutexes[i]);
pthread_cond_destroy(&conditionVars[i]);
}
return
0;
}
댓글 없음:
댓글 쓰기