1.任务:用户从终端输入任意字符然后统计字符个数显示,输入end则结束
2.使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <pthread.h>
5 #include <semaphore.h>
6
7 char buf[200] = {0};
8 sem_t sem;
9 void *func(void *arg);
10 //子线程程序,作用就是统计buf中的字符个数并打印
11 void *func(void *arg)
12 {
13 //子线程中首先应该有个循环,在等待主线程激活的时候要在循环中阻塞;
14 //子线程被激活后就去获取buf中的字符长度,然后打印;打印完成之后再次被阻塞
15 sem_wait(&sem);
16 while(strncmp(buf, "end", 3) != 0)
17 {
18 printf("输入了%d个字符\n",strlen(buf));
19 memset(buf, 0, sizeof(buf));
20 sem_wait(&sem);
21 }
22 pthread_exit(NULL);
23 }
24
25 int main(void)
26 {
27 int ret = -1;
28 pthread_t th = -1;
29
30 sem_init(&sem, 0, 0);
31
32 ret = pthread_create(&th, NULL, func, NULL);
33 if(ret != 0)
34 {
35 printf("pthread_create error\n");
36 exit(-1);
37 }
38
39 printf("请输入字符,以回车键结束\n");
40 while(scanf("%s",buf))
41 {
42 //判断用户输入的是不是end,如果是,则退出;如果不是,则继续
43 if(!strncmp(buf, "end", 3))
44 {
45 //输入的是end
46 printf("程序结束\n");
47 sem_post(&sem);//激活信号量
48 break;
49 }
50 //主线程在收到用户输入的字符串之后,并且确认不是end,就去发信号激活子线程来计数
51 //子线程被阻塞,主线程可以激活,这就是线程的同步问题
52 //信号量就可以用来实现这个线程同步
53 sem_post(&sem);//激活信号量
54
55 }
56
57 //回收子线程
58 printf("等待回收子线程.\n");
59 ret = pthread_join(th, NULL);
60 if(ret != 0)
61 {
62 printf("pthread_join error.\n");
63 exit(-1);
64 }
65 printf("子线程回收成功.\n");
66
67 sem_destroy(&sem);
68 return 0;
69 }
来源:https://www.cnblogs.com/jiangtongxue/p/11307314.html