概述
#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:
%dn", 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:%dn", 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;
}
最后
以上就是甜美草莓为你收集整理的操作系统 三个并发进程的全部内容,希望文章能够帮你解决操作系统 三个并发进程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复