笔记整理—linux进程部分(8)线程与进程

news/2024/10/8 20:42:02 标签: linux, 笔记, 嵌入式硬件, c语言, arm开发

        前面用了高级IO去实现鼠标和键盘的读取,也说过要用多进程方式进行该操作:

int mian(void)
{
    int ret=-1;
    int fd=-1;
    char bug[100]={0};
    ret=fork();
    if(0==ret)
        {
            //子进程,读鼠标
        }
    if(0<ret)
        {
            //父进程,读键盘
        }
    else
        {
            perror("fork");
        }
    
}

        使用多线程实现宏观上的并发方法:①cpu分时复用,单核cpu实现宏观上并发;②实现多任务系统需求(多任务的客观需求)。是任务轮询,让cpu能干更多的活。

        进程技术的劣势:①进程间相互切换的开销很大,因为每执行一次进程切换,又轮到当前进程时候需要读出断点,再切换进程以此往复。②进程与进程间又天生的隔离,通信效率低。

        解决方案——使用线程技术。线程救赎保留了进程多任务的特性,改进了线程间切换与通信的效率,多线程在多核心cpu上更具有优势。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
void *func(void *arg)
{
    //读键盘
}

int main(void)
{
    pthread_t th=-1;
    ret=pthread_create(&th,NULL,func,NULL);
    if(ret!=0)
        {
            err;
            return -1;
        }
    //开始主任务,读鼠标
}

        编译时,使用-lpthread链接线程库:

gcc xxx.c -lpthread

        线程是一种轻量的进程,线程是参与调度的最小单元,一个进程可以有多个线程。

        线程的优势,①像进程一样能被OS单独调度。②同一进程的多个线程间的通信十分简单(就是函数与函数间通信一样的简单)。③多核心的cpu架构下效率能最大化,多线程运行在不同的核心上,多核cpu(堆成多处理器架构SMP)。

        线程常用函数:

        ①进程创建于回收

pthread_create()主线程创建子进程
pheread_join()主线程用于等待回收子线程
pheread_detach()主线程于子线程分离,分离后自己回收自己

        ②线程取消:一个线程可以被另一个线程中止

pthread_cancel()一个线程调用,终止另一个线程(主销子)
pthread_setcancelstate()子线程对线程取消信号的反应(线程十分运行被信号终止)
pthread_setcanceltype()线程终止时候的模式

        ③线程函数退出相关:子线程自己return一类

pthread_exit()子线程标准退出麻烦和值给pthread_join
pthread_cleanup_push()线程同步相关,用于清理的函数压栈保存
pthread_pop用着清理函数的取出是否执行,保证cleanup的函数能在主线程结束时依然能执行于保存

        ④获得自己的线程ID

pthread_self()

        pthread的p是posix是Unix标准。

        线程同步的方法——信号量。

        使用线程实现一个线程输入字符,一个线程统计输出。

        子线程void func(void *arg):①子线程是一个循环。②子线程阻塞等单子线程激活,等待传递buf。③计数完成,变为阻塞态,等待主线程buf。

        主线程int main()①创建子线程。②接受字符串。③激活子线程干活实现线程同步。

        

char buf[200]={0};
sem_t sem;

void *func(void *arg)
{
    sem_wait(&sem);//阻塞等待信号
    while(strncmp(buf,"end",3)!=0)
    {
        printf("本次打印%d个字符\n",strlen(buf));
        memset(buf,0,sizeof(buf));
        sem_wait(&sem);//阻塞while
    }
    pthread_exit(NULL);//线程return
}


int main(void)
{
    int ret=-1;
    pthread_t th=-1;//线程属性
    sem_init(&sem,0,0);//信号初始化
    ret=pthread_create(&th,NULL,func,NULL);
    if(0!=ret)
    {
        线程申请err
        exit(-1);
    }
    printf("输入一个字符串\n");
    while(scanf("%s",buf))
    {
        if(!strncmp(buf,"end",3))//接收到end字符
        {
            printf(“end\n”);
            sem_post(&sem);//发信号,子线程做最后一次判别工作
            break;
        }
    sem_post(&sem);//正常接受字符串,发信号通知子线程干活
    }
    //回收子线程
    ret=pthread_join(th,NULL);//(线程号,参数)
    if(0!=ret)
    {
        回收失败
        exit(-1);
    }
    sem_destroy(&sem);//回收信号
    return 0;
}

        本次使用的信号,基本上是让程序称为盘子里的鱼,戳一下,动一下,也就是很像flag,1表示work,0表示不动,每动一下flag就置位为0那种。


http://www.niftyadmin.cn/n/5694761.html

相关文章

浅色系统B端管理系统标配,现在也卷起了可视化,挡不住呀

在 B 端管理系统的领域中&#xff0c;浅色系统一直以来都是标配之选。其简洁、清新的外观&#xff0c;给人以专业、高效的视觉感受。如今&#xff0c;浅色系统更是卷入了可视化的浪潮&#xff0c;这一趋势势不可挡。 浅色系统的优势在于它能够营造出一种舒适的视觉环境&#x…

​自动猫砂盆到底有没有必要?过来人经验:千万别再盲目选择了!

不知道大家养猫有没有一样的烦恼&#xff0c;就是上班时间到底要怎么保证猫砂盆里的猫屎被铲干净呢&#xff1f;放一天不铲的话&#xff0c;一次两次还行&#xff0c;长期这样就会害的猫砂盆内部细菌增多&#xff0c;甚至长虫&#xff0c;严重危害小猫的健康安全&#xff0c;但…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 OpenHarmony Camera驱动模型结构 HDI Implementation&#x…

详细介绍pandas 在python中的用法

Pandas 是 Python 中非常流行的数据分析和处理库&#xff0c;特别适用于处理结构化数据。它构建在 NumPy 之上&#xff0c;提供了更高级的功能&#xff0c;例如数据清理、整理、筛选和统计分析。Pandas 的核心数据结构是 Series 和 DataFrame&#xff0c;分别用于处理一维数据和…

QD1-P4 HTML常用标签之标题和水平线

本节视频 www.bilibili.com/video/BV1n64y1U7oj?p4 ‍ 本节学习&#xff1a; title标签&#xff08;页面标题&#xff09;h标签&#xff08;文章标题&#xff09;hr标签&#xff08;横线&#xff09;body标签的属性&#xff08;网页背景色&#xff0c;字体颜色&#xff09…

要实现无限极评论

要实现无限极评论&#xff0c;可以利用数据库的树状结构来存储评论数据&#xff0c;并使用递归算法来获取无限极评论。下面我来详细介绍实现的方法和操作流程。 1. 数据库设计 首先&#xff0c;需要设计一个数据库表来存储评论数据。可以定义一个名为comments的表&#xff0c;…

git 报错git: ‘remote-https‘ is not a git command. See ‘git --help‘.

报错内容 原因与解决方案 第一种情况&#xff1a;git路径错误 第一种很好解决&#xff0c;在环境变量中配置正确的git路径即可&#xff1b; 第二种情况 git缺少依赖 这个情况&#xff0c;网上提供了多种解决方案。但如果比较懒&#xff0c;可以直接把仓库地址的https改成ht…

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…