寿司店问题 PV操作 pthread表示

寿司店问题。假设一个寿司店有 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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球