线程同步一例

功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到buffer,然后通知副线程将数据打印,打印完后,副线程通知主线程继续从输入缓冲区中将读到的字符写到buffer数组。当输入quit命令时,主线程退出,副线程也会随着主线程的结束而自动结束。

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 
 7 
 8 char buffer[128];
 9 sem_t sem1;
10 sem_t sem2;
11 
12 void *fun(void * arg)
13 {
14 
15     while(1)
16     {
17         if(sem_wait(&sem2) == -1)  //读之前申请读信号
18         {
19             perror("sem_wait sem2");
20             exit(-1);
21         }
22         printf(">>>%s",buffer);
23         if(sem_post(&sem1) == -1)  //读完了后发送写信号
24         {
25             perror("sem_wait sem2");
26             exit(-1);
27         }
28     }
29 
30 }
31 
32 int main(void)
33 {
34 
35     pthread_t thread;
36 
37     if(sem_init(&sem1, 0, 1) == -1)  //将写信号初始化为1
38     {
39         perror("sem_init");
40         exit(-1);
41     }
42     if(sem_init(&sem2, 0, 0) == -1) //将读信号初始化为0
43     {
44         perror("sem_init");
45         exit(-1);
46     }
47     if(-1 == pthread_create(&thread, NULL, fun, NULL))  //创建线程
48     {
49         exit(-1);
50     }
51 
52     do
53     {
54         if(sem_wait(&sem1) == -1)  //写之前申请写资源
55         {
56             perror("sem_wait sem1");
57             exit(-1);
58         }
59         fgets(buffer, 128, stdin);
60         if(sem_post(&sem2) == -1)  //写之后发送读资源
61         {
62             perror("sem_wait sem1");
63             exit(-1);
64         }
65     }while(strncmp(buffer, "quit", 4) != 0); //输入quit,主线程结束,副线程也就退出
66 
67 
68     return 0;
69 }
View Code

image

原文地址:https://www.cnblogs.com/pengdonglin137/p/2950697.html