zoukankan      html  css  js  c++  java
  • 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个字符
    ",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
    ");
    36         exit(-1);
    37     }
    38     
    39     printf("请输入字符,以回车键结束
    ");
    40     while(scanf("%s",buf))
    41     {
    42         //判断用户输入的是不是end,如果是,则退出;如果不是,则继续
    43         if(!strncmp(buf, "end", 3))
    44         {
    45             //输入的是end
    46             printf("程序结束
    ");
    47             sem_post(&sem);//激活信号量
    48             break;
    49         }
    50         //主线程在收到用户输入的字符串之后,并且确认不是end,就去发信号激活子线程来计数
    51         //子线程被阻塞,主线程可以激活,这就是线程的同步问题
    52         //信号量就可以用来实现这个线程同步
    53         sem_post(&sem);//激活信号量
    54         
    55     }
    56     
    57     //回收子线程
    58     printf("等待回收子线程.
    ");
    59     ret = pthread_join(th, NULL);    
    60     if(ret != 0)
    61     {
    62         printf("pthread_join error.
    ");
    63         exit(-1);
    64     }
    65     printf("子线程回收成功.
    ");
    66     
    67     sem_destroy(&sem);
    68     return 0;
    69 }
  • 相关阅读:
    python--网络通信协议
    python--网络编程之socket
    python--内置函数03
    在Mapper中sql语句字段与实体类属性名字之间的关系
    网站引入QQ登录
    子类继承父类时构造函数的相关问题
    java中字符串比较的问题
    Mybatis中一对多与多对一的配置
    Spring中的依赖注入(1)
    P1618 三连击(升级版)
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11307314.html
Copyright © 2011-2022 走看看