打印
[boot]

Linux-线程同步之信号量

[复制链接]
522|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒋博1026|  楼主 | 2019-8-18 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.任务:用户从终端输入任意字符然后统计字符个数显示,输入end则结束
2.使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
char buf[200] = {0};
sem_t sem;
void *func(void *arg);
//子线程程序,作用就是统计buf中的字符个数并打印
void *func(void *arg)
{
    //子线程中首先应该有个循环,在等待主线程激活的时候要在循环中阻塞;
    //子线程被激活后就去获取buf中的字符长度,然后打印;打印完成之后再次被阻塞
    sem_wait(&sem);
    while(strncmp(buf, "end", 3) != 0)
    {
        printf("输入了%d个字符\n",strlen(buf));
        memset(buf, 0, sizeof(buf));
        sem_wait(&sem);
    }
    pthread_exit(NULL);
}
int main(void)
{
    int ret = -1;
    pthread_t th = -1;
   
    sem_init(&sem, 0, 0);
   
    ret = pthread_create(&th, NULL, func, NULL);
    if(ret != 0)
    {
        printf("pthread_create error\n");
        exit(-1);
    }
   
    printf("请输入字符,以回车键结束\n");
    while(scanf("%s",buf))
    {
        //判断用户输入的是不是end,如果是,则退出;如果不是,则继续
        if(!strncmp(buf, "end", 3))
        {
            //输入的是end
            printf("程序结束\n");
            sem_post(&sem);//激活信号量
            break;
        }
        //主线程在收到用户输入的字符串之后,并且确认不是end,就去发信号激活子线程来计数
        //子线程被阻塞,主线程可以激活,这就是线程的同步问题
        //信号量就可以用来实现这个线程同步
        sem_post(&sem);//激活信号量
        
    }
   
    //回收子线程
    printf("等待回收子线程.\n");
    ret = pthread_join(th, NULL);   
    if(ret != 0)
    {
        printf("pthread_join error.\n");
        exit(-1);
    }
    printf("子线程回收成功.\n");
   
    sem_destroy(&sem);
    return 0;
}


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1820

帖子

18

粉丝