linux-线程同步之信号量

Posted ❤志瞳道合❤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于linux-线程同步之信号量的主要内容,如果未能解决你的问题,请参考以下文章

Linux多线程之线程同步

Linux-线程同步之互斥锁

Linux线程同步之条件变量pthread_cond_t

Linux线程同步之条件变量pthread_cond_t

linux进程间通信之Posix 信号量用法详解代码举例

线程同步之信号量