寿司店问题。假设一个寿司店有 5 个座位,如果你到达的时候有一个空座位,你可以立刻就坐。但是如果你到达的时候 5 个座位都是满的有人已经就坐,这就意味着这些人都是一起来吃饭的,那么你需要等待所有的人一起离开才能就坐。编写同步原语,实现这个场景的约束。
1 #include
2 #include
3 #include
4 #include
5 sem_t mutex;
6 sem_t allowin;
7 int waiting = 0;
8 int eating = 0;
9 int barrier = 0;
10 void *thread_a(void *in)
11 {
12 sem_wait(&mutex);
13 if (barrier) {
14 waiting++;
15 sem_post(&mutex);
16 sem_wait(&allowin);
17 }
18 else {
19 eating++;
20 barrier = (eating == 5);
21 sem_post(&mutex);
22 23 }
24 25 printf("No.%s takes seat and eats (person eating:%d)\n ", (char *)in, eating);
26 sleep(1);
27 sem_wait(&mutex);
28 eating--;
29 if (eating == 0) {
30 int n = (5 < waiting) ? 5 : waiting;
31 waiting -= n;
32 eating += n;
33 barrier = (eating == 5);
34 for (int i = 0; i < n; i++)
35 sem_post(&allowin);
36 }
37 sem_post(&mutex);
38 printf("No.%s leaves\n", (char *)in);
39 pthread_exit((void *)0);
40 }
41 int main()
42 {
43 const int maxn = 10;
44 pthread_t a[maxn]; /* thread id a, b, c*/
45 char *strs[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
46 int val; /* used for function return result */
47 /* init sem1 sem2 to 0 , any thread waits for it will be blocked*/
48 sem_init(&mutex, 0, 1);
49 sem_init(&allowin, 0, 1);
50 for (int i = 0; i < maxn; i++)
51 pthread_create(&a[i], NULL, thread_a, (void *)strs[i]);
52 for (int i = 0; i < maxn; i++)
53 pthread_join(a[i], (void **)0);
54 sem_destroy(&mutex);
55 sem_destroy(&allowin);
56 57 printf("Main thread is over\n");
58 return 0;
59 }
Original: https://www.cnblogs.com/cywuuuu/p/16249103.html
Author: cywuuuu
Title: 寿司店问题 PV操作 pthread表示
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715123/
转载文章受原作者版权保护。转载请注明原作者出处!