复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103#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; }
最后
以上就是甜美草莓最近收集整理的关于操作系统 三个并发进程的全部内容,更多相关操作系统内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复