#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define LIMIT 20
#define M 5
#define N 8
/************************************/
int buffer1[M];
int buffer2[N];
sem_t p_q_full, p_q_empty, q_r_full, q_r_empty, mutex;
int p_writepos = 0, q_readpos = 0, q_writepos = 0, r_readpos = 0;
/************************************/
void sleep_random(int t) {
sleep((int)(t * (rand() / (RAND_MAX *1.0))));
}
void *P(){
int i;
for (i = 0; i < LIMIT; i++){
sleep_random(2);
/************************************/
sem_wait(&p_q_empty);
sem_wait(&mutex);
printf("P sends: %d\n", i + 1);
buffer1[p_writepos++] = i + 1;
if (p_writepos >= M)
p_writepos = 0;
sem_post(&mutex);
sem_post(&p_q_full);
/************************************/
}
}
void *Q(){
int i, data;
for (i = 0; i < LIMIT; i++){
int tmp;
sleep_random(2);
/************************************/
sem_wait(&p_q_full);
sem_wait(&mutex);
tmp = buffer1[q_readpos];
buffer1[q_readpos++] = -1;
if (q_readpos >= M)
q_readpos = 0;
sem_post(&mutex);
sem_post(&p_q_empty);
sem_wait(&q_r_empty);
sem_wait(&mutex);
buffer2[q_writepos++] = tmp;
if (q_writepos >= N)
q_writepos = 0;
sem_post(&mutex);
sem_post(&q_r_full);
/************************************/
}
}
void *R(){
int i;
for (i = 0; i < LIMIT; i++){
sleep_random(2);
/************************************/
sem_wait(&q_r_full);
sem_wait(&mutex);
printf("R receives:%d\n", buffer2[r_readpos]);
buffer2[r_readpos++] = -1;
if (r_readpos >= N)
r_readpos = 0;
sem_post(&mutex);
sem_post(&q_r_empty);
/************************************/
}
}
int main(){
sem_init(&p_q_full, 0, 0);
sem_init(&p_q_empty, 0, M);
sem_init(&q_r_full, 0, 0);
sem_init(&q_r_empty, 0, N);
sem_init(&mutex, 0, 1);
int i;
pthread_t t1, t2;
for (i = 0; i < M; i++)
buffer1[i] = - 1;
for (i = 0; i < N; i++)
buffer2[i] = - 1;
srand((int)time(0));
/************************************/
/************************************/
pthread_create(&t1, NULL, P, NULL);
pthread_create(&t2, NULL, Q, NULL);
R();
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
操作系统 三个并发进程
最新推荐文章于 2025-02-28 00:15:00 发布