Linux--多线程(1)

2023-11-10

目录

一、概念

二、理解

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

//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来源于线程返回给主线程

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--多线程(1) 的相关文章

随机推荐

  • 力扣 289. 生命游戏

    虽然难度是中等但其实很简单 遍历矩阵判断每个点是死是活就可以了 进阶要求使用原地算法 即空间复杂度为O 1 所以我们不能简单的记录1是活 0是死 我规定 1 原来活 活变活 0 原来死 死变死 2 死变活 1 活变死 自己的 0ms cla
  • Windows Server 2012 R2 -DNS服务器安装与测试(VMware workstation环境)

    Windows Server 2012 R2 DNS服务器安装与测试 VMware workstation环境 搭建拓扑如下 DNS后缀名设置 DNS服务器 虚拟机 IP设置 DNS指向自己 物理机net8虚拟网卡IP设置 DNS指向DNS
  • Vivado 2018.3 安装步骤及 license 获取

    本文的主要内容是介绍 Vivado 2018 3 版本的安装步骤及其 license 的获取与加载 首先下载安装包 将其在没有中文的路径下解压 注意在解压前最好关闭电脑的杀毒软件 防止某些文件被拦截或者删除 解压完成后打开文件夹 在最底部双
  • Java多线程-并行处理以及事务控制

    1 为了提高我们接口的响应速度 我们可以开多个线程 并行处理 比如我们要大批量写入数据到数据库 Autowired private ThreadPoolExecutor executor Autowired private Platform
  • 六. HTTPS确保Web安全

    六 HTTPS确保Web安全 1 HTTP的缺点 通信使用明文 内容可能会被盗取 互连网中使用TCP IP协议族进行通信的过程中会经过非常多的通信载体 网关 路由器等 而这些主机并不可能完全是私人的 所以可能某个环节遭到恶意窥视 抓包 当然
  • Android 整合高德地图SDK实现 地图预览,定位,模拟导航

    一 准备工作 1 到高德地图官方网申请key 我的应用 高德控制台 2 申请key方法请参考 获取Key 创建工程 开发指南 Android 地图SDK 高德地图API 3 出现的问题 其中有一个获取SHA1的问题 E AmapErr 定位
  • Tracker 服务器地址大全 Tracker List

    https dns icoa cn tracker udp tracker tiny vps com 6969 announce https 1337 abcvg info announce https tracker fastdownlo
  • 【Linux系统编程(二)】Linux文件IO操作

    文章目录 Linux文件IO操作 1 系统调用 2 系统调用和库函数的区别 3 C库中IO函数工作流程 4 文件描述符 4 1 文件描述符表是如何管理文件描述符的呢 4 2 查看当前系统文件描述最大数量 5 文件IO的操作 5 1 open
  • 关于split(String agrex)

    split a b c 得到 a b c a b c 得到 a b c 前面的空格一个都不会省略 a b c 得到 a b c 中间空格省略一个 后缀的空格全部省略 不是以空格而是以某个String为划分依据时 现象相同 split a a
  • 2021-06-22安装docker-ce

    安装docker ce Docker 支持以下的 64 位 CentOS 版本 CentOS 7 CentOS 8 更高版本 使用官方安装脚本自动安装 安装命令如下 curl fsSL https get docker com bash s
  • VUE问题汇总(一)

    vue的起步教程与api https cn vuejs org v2 guide vue组件库 https element eleme cn zh CN component installation 1 解决vue中时间控件中获取时间少一天
  • 前端三大框架(vue、react、angular)对比(一)

    官网 vue https cn vuejs org react https react docschina org angular https angular cn 三者总体介绍 都是MVVM 从后端的MVC衍生 类型的框架 基本都用于构建
  • 时序数据库timescaleDB安装

    参考链接 时序数据库timescaleDB安装 http www lwops cn thread 300 1 1 html 本环境在Centos7 5采用编译安装的方式 主要介绍PostgreSQL 11 7 TimescaleDB 1 6
  • 机器学习理论笔记(一):初识机器学习

    文章目录 1 前言 蓝色是天的机器学习笔记专栏 1 1 专栏初衷与定位 1 2 本文主要内容 2 机器学习的定义 2 1 机器学习的本质 2 2 机器学习的分类 3 机器学习的基本术语 4 探索 没有免费的午餐 定理 NFL 5 结语 1
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架 被开发者用于实施对应用程序的单元测试 加快程序编制速度 同时提高编码的质量 JUnit 测试框架具有以下重要特性 测试工具 测试套件 测试运行器 测试分类 了解 Junit 基础方法 加入依赖 在 po
  • Eclipse中的checkstyle插件

    一 Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准 官方地址 http checkstyle sourceforge net 二 在Eclipse
  • PPT模板

    http www officeplus cn List shtml cat PPT tag 1
  • CH3-Android常见界面控件

    目标 掌握简单控件的使用 能够独立搭建一个注册界面 掌握ListView控件与RecyclerView控件的使用 能独立搭建列表界面 掌握自定义控件的定义方式 能够自定义一个简单的控件 几乎每一个Android应用都是通过界面控件与用户交互
  • Linux--多线程(1)

    目录 一 概念 二 理解 三 创建 退出 合并进程 man pthread create Compile and link with pthread 1 为什么没有fun函数 2 加上sleep来改进 3 线程结束会不会影响主线程运行 4