Linux--多线程(1)

目录

一、概念

二、理解

三、创建、退出、合并进程

//man pthread_create

//Compile and link with -pthread.

//1.为什么没有fun函数?

//2.加上sleep来改进

//3.线程结束会不会影响主线程运行?

//4.那如果主线程比较少呢?

四、如何解决主线程比子线程早结束,子线程不执行问题?

调用等待线程:pthread_join();

五、退出程序

pthread_exit();


一、概念

进程:一个正在运行的程序;

线程:进程内部的一条执行路径(序列)

目的:理解并发运行、知道如何同步、知道线程安全概念

并发:在一段时间内,两条交替运行,只有一个处理器

并行:两条路径一直在执行,单个处理器无法满足,需要多个处理器,有多个处理器也不一定是并行(要共享,不一定能独占)

 

二、理解

//只有唯一一条执行路径;

//有三条执行路径(三个线程可以做同一件事,也可做三件事)

三、创建、退出、合并进程

pthread_create()//创建线程

pthread_exit()//退出线程

pthread_join()//等待线程结束/合并线程

//man pthread_create

//线程ID、线程的属性(如果不设置,就给空指针)、线程函数(函数指针)、线程函数的参数(不传给空)

//main.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<5;i++)
    {   
        printf("fun run\n");
    }   
}

int main()
{
    pthread_t id; 
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<5;i++)
    {   
        printf("main run\n");
    }   
}

//此时我们直接运行,发现出错了

//Compile and link with -pthread.

所以 我们现在要指定线程库(-l指定库)

//1.为什么没有fun函数?

因为主函数一旦运行完了,在最后执行力exit,这个exit会退出整个进程,若此时线程还没有来得及往屏幕上打印,那么它就再也没有打印的机会了,整个进程退出了,线程没有运行完不等

//2.加上sleep来改进

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<5;i++)
    {
        printf("fun run\n");
        sleep(1);
    }
}

int main()
{
    pthread_t id;
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<5;i++)
    {
        printf("main run\n");
        sleep(1);
    }
}

//运行结果

//main函数和fun函数同时交替进行(结果不一定是这个顺序)

//3.线程结束会不会影响主线程运行?

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<2;i++)
    {   
        printf("fun run\n");
        sleep(1);
    }   
}

int main()
{
    pthread_t id; 
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<5;i++)
    {   
        printf("main run\n");
        sleep(1);
    }   
    exit(0);
}

 //两个fun打印完了之后没有打印的main还在继续打印

//4.那如果主线程比较少呢?

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<7;i++)
    {   
        printf("fun run\n");
        sleep(1);
    }   
}

int main()
{
    pthread_t id; 
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<2;i++)
    {   
        printf("main run\n");
        sleep(1);
    }
    exit(0);   
}

//本来主线程的结束跟子线程的结束没有必然的关系,但是主线程中有exit(0),会退出进程,就算不写exit,系统也会自动调用。

四、如何解决主线程比子线程早结束,子线程不执行问题?

调用等待线程:pthread_join();

// 线程参数、二级指针(接受线程反馈给主线程的信息,不接收的话给空)

clude<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<7;i++)
    {   
        printf("fun run\n");
        sleep(1);
    }   
}

int main()
{
    pthread_t id; 
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<2;i++)
    {   
        printf("main run\n");
        sleep(1);
    }   
    pthread_join(id,NULL);
    exit(0);
}
~            

 //main程序两次执行完了,还在执行fun函数,直至fun函数结束,join才会返回。

五、退出程序

pthread_exit();

//二级指针 (返回值不能是临时变量,可以为全局变量或者字符串常量,如果是临时空间,被销毁了就无法使用了)

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* fun(void* arg)
{
    for(int i=0;i<7;i++)
    {
        printf("fun run\n");
        sleep(1);
    }
    pthread_exit("fun over");
}

int main()
{
    pthread_t id;
    pthread_create(&id,NULL,fun,NULL);
    for(int i=0;i<2;i++)
    {
        printf("main run\n");
        sleep(1);
    }
    char* s=NULL;
    pthread_join(id,(void**)&s);//传指针的地址会让s去指向fun over,接受线程反馈的指
    printf("s=%s\n",s);
    exit(0);
}

//执行结果,字符串s来源于线程返回给主线程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/93.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP协议+以太网协议

在计算机网络体系结构的五层协议中&#xff0c;第三层就是负责建立网络连接&#xff0c;同时为上层提供服务的一层&#xff0c;网络层协议主要负责两件事&#xff1a;即地址管理和路由选择&#xff0c;下面就网络层的重点协议做简单介绍~~ IP协议 网际协议IP是TCP/IP体系中两…

RecyclerView流程学习

RecyclerView流程学习模块划分绘制流程onMeasuremLayout为nullmLayout开启自动测量未开启自动测量onLayoutonDrawonLayoutChildren缓存预加载滚动和fling模块划分 RecyclerView中根据其功能可以分为以下几个模块&#xff1a; Recycler mRecycler // 缓存管理者&#xff0c;fi…

yolov5的基本配置

yolov5的基本配置train.pydata.yaml数据集标签文件格式:总结train.py def parse_opt(knownFalse):parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, defaultROOT / yolov5s.pt, helpinitial weights path)parser.add_argument(--cfg, typestr, defau…

uniCloud在线升级APP配置教程

app在线升级背景实现思路流程流程背景 因用户需要添加手机h5页面来进数据操作实现思路流程 实现流程图流程 相关文档&#xff1a;帮助文档 https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html 注册服务空间 https://unicloud.dcloud.net.cn/pages/login/login uni升级…

基于Yolv5s的口罩检测

1.Yolov5算法原理和网络结构 YOLOv5按照网络深度和网络宽度的大小&#xff0c;可以分为YO-LOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文使用YOLOv5s&#xff0c;它的网络结构最为小巧&#xff0c;同时图像推理速度最快达0.007s。YO-LOv5的网络结构主要由四部分组成&#xff0c;分别…

三天吃透MySQL八股文(2023最新整理)

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

博客系统(界面设计)

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录实现博客列表页预期效果导航栏页面主体左右布局左侧区域右侧区域完整代码实现博客详情页预期效果导航栏 左侧右侧完整代码实现…

全国程序员薪酬大曝光!看完我酸了····

2023年&#xff0c;随着互联网产业的蓬勃发展&#xff0c;程序员作为一个自带“高薪多金”标签的热门群体&#xff0c;被越来越多的人所关注。在过去充满未知的一年中&#xff0c;他们的职场现状发生了一定的改变。那么&#xff0c;程序员岗位的整体薪资水平、婚恋现状、职业方…

认识TomcatMavenServlet第一个Servlet程序

文章目录一、什么是Tomcat、什么是Servlet二、Tomcat的下载与使用关于下载启动欢迎页面查看可能出现的问题博客系统静态页面的部署三、什么是Maven四、第一个servlet程序1.创建Maven项目2.引入依赖3.创建目录结构4.编写程序5.打包程序6.部署程序7.验证小结五、servlet程序简化版…

学习 Python 之 Pygame 开发魂斗罗(四)

学习 Python 之 Pygame 开发魂斗罗&#xff08;四&#xff09;继续编写魂斗罗1. 创建子弹类2. 根据玩家方向和状态设置子弹发射的位置(1). 站立向右发射子弹(2). 站立向左发射子弹(3). 站立朝上发射子弹(4). 蹲下发射子弹(5). 向斜方发射子弹(6). 奔跑时发射子弹(7). 跳跃时发射…

图片的美白与美化

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

Python雪花代码

前言 用python画个雪花玩玩&#xff0c;源码在文末公众号哈。 雪花类 class Snow(): #雪花类 def __init__(self): self.r 6 #雪花的半径 self.x ra.randint(-1000,1000) #雪花的横坐标 self.y ra.randint(-500,5…

读书笔记——《富爸爸穷爸爸》

《富爸爸穷爸爸》&#xff0c;以前不屑读这种书。这种书就是那种走进书店放在门口展销位的成功学著作&#xff0c;一眼看上去没什么实在的内容&#xff0c;看上去很不靠谱&#xff0c;感觉就是骗一些社会底层又做着暴富梦的人来买的&#xff0c;但是由于自身原因或环境局限根本…

MySQL基本查询

文章目录表的增删查改Create&#xff08;创建&#xff09;单行数据 全列插入多行数据 指定列插入插入否则更新替换Retrieve&#xff08;读取&#xff09;SELECT列全列查询指定列查询查询字段为表达式查询结果指定别名结果去重WHERE 条件基本比较BETWEEN AND 条件连接OR 条件连…

【面试题】Python软件工程师能力评估试题(一)

文章目录前言应试者需知&#xff08;一&#xff09;Python 语言基础能力评估1、理解问题并完成代码&#xff1a;2、阅读理解代码&#xff0c;并在空白处补充完整代码&#xff1a;3、编写一个装饰器&#xff1a;exposer4、阅读代码并在空白处补充完整代码&#xff1a;5、自行用P…

嵌入式 串口通信

目录 1、通信的基本概念 1.1 串行通信 1.2 并行通信 2、串行通信的特点 2.1 单工 2.2 半双工 2.3 全双工 3、串口在STM32的引脚 4、STM32的串口的接线 4.1 STM32的串口1和电脑通信的接线方式 4.2 单片机和具备串口的设备连接图 5、串口通信协议 6、串口通信…

linux进程管理

进程管理 进程是启动的可执行程序的一个指令 1、进程简介 &#xff08;1&#xff09;进程的组成部分 已分配内存的地址空间安全属性&#xff0c;包括所有权凭据和特权程序代码的一个或多个执行线程进程状态 &#xff08;2&#xff09;程序和进程的区别 程序是一个静态的二进制…

第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解

文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描述 1、4、2 题解关…

28岁小公司程序员,无车无房不敢结婚,要不要转行?

大家好&#xff0c;这里是程序员晚枫&#xff0c;又来分享程序员的职场故事了~ 今天分享的这位朋友叫小青&#xff0c;我认识他2年多了。以前从事的是土木行业&#xff0c;2年前找我咨询转行程序员的学习路线和职业规划后&#xff0c;通过自学加入了一家创业公司&#xff0c;成…

分享几个常用的运维 shell 脚本

今天咸鱼给大家分享几个不错的 Linux 运维脚本&#xff0c;这些脚本中大量使用了 Linux 的文本三剑客&#xff1a; awkgrepsed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根据 PID 显示进程所有信息 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 #! /b…