linux-线程同步之信号量
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 }