浅谈linux - 线程的基本应用

2023-05-16

概述

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

注意

线程和进程之间的区别

1. 线程是执行的基本单位;进程是资源分配的基本单位。

2. 线程共享进程的资源,一个进程中至少有一个线程. 主线程。

3. 进程有自己的pid,还有自己的PCB;线程有自己的tid,也有自己的TCB。

4. 线程也有自己私有的资源。

另外,小编所有文章均是自己亲手编写验证,由于文件太多,小编就不在公众号后台一一回复列举了,若需要小编的工程代码,请关注公众号:不只会拍照的程序猿,后台回复需要的工程文件。小编看到后会第一时间回复。

接口

线程创建 

进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create。另外创建新的线程以后,新的线程和原来的线程是异步的。

/**
 * @ 创建一个新的线程 "pthread_create(3)"
 * @ thread: 新创建的线程的id存储到这里        attr:NULL表明线程创建的时候,使用默认属性
 * @ start_routine: 线程的执行函数            arg:传递给线程执行函数的唯一的参数
 * @ 成功返回0;错误返回一个错误号errno被设置
 */
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                  void *(*start_routine) (void *), void *arg);

线程终止

线程终止有三种方式。

方式一:执行完成后隐式退出。

方式二:由线程本身显示调用pthread_exit 函数退出。

/**
 * @ 终止当前线程 "pthread_exit(3)"
 * @ retval: 通过这个参数返回一个值,这个值被同一进程中的另外一个线程调用pthread_join(3)使用
 */
void pthread_exit(void *retval);

方式三:被其他线程用pthread_cance函数终止。

/**
 * @ 给一个线程发送取消请求 "pthread_cancel(3)"
 * @ thread: 指定了目标线程的id
 * @ 成功返回0;错误返回非0错误码
 */
int pthread_cancel(pthread_t thread);

线程汇合

主线程可以等待子线程终止并与之汇合后继续运行,子线程终止后主线程将回收该线程的相关资源。

/**
 * @ 汇合一个终止的线程 "pthread_join(3)"
 * @ thread: 指定了要汇合的线程的id.目标线程的id
 * @ retval: 退出状态码被保存到*retval中.如果是被取消的线程,PTHREAD_CANCELED---->*retval中
 * @ 成功返回0;错误返回一个错误号
 */
int pthread_join(pthread_t thread, void **retval);

线程分离

/**
 * @ 分离一个线程 "pthread_detach(3)"
 * @ thread: 指定了要分离的线程的id
 * @ 成功返回0;错误返回一个错误号
 */
int pthread_detach(pthread_t thread);

获取线程的tid

/**
 * @ 获取当前线程的id "pthread_self(3)"
 * @ 返回当前的线程的id
 */
pthread_t pthread_self(void);

示例

★示例通过pthread_test.c向用户展示线程的基本使用。

★包含演示程序pthread_test.c(已验证通过)。

e1df3a50d127e6cd10251eb73be0fbf7.png pthread_test.c

/**
 * @Filename : pthread_test.c
 * @Revision : $Revision: 1.00 $
 * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
 * @Description : 线程的基本应用示例
**/

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

/**
 * @ 线程执行函数
 * @ args: 传递来的参数
 */
static void *thread1(void *args)
{
    /* 1. 获取参数信息 */
    printf("%s\n", (char *)args);

    /* 2. 获取当前线程id */
    pthread_t pthread_self (void);
    printf("tid is %lu\n", (int)pthread_self());

    sleep(3);
    return (void *)7;
}


/**
 * @ 主函数,程序入口
 */
int main(void)
{
    void *ret;
    pthread_t tid;      /* 线程ID */

    /* 创建线程 */
    if (pthread_create(&tid, NULL, thread1, "feng") != 0) {
        printf("pthread create failed...\n");
        return -1;
    }

    /* 阻塞等待线程的汇合,接收线程的退出状态码 */
    pthread_join(tid, &ret);
    printf("thread1 exit code %d\n", (int)ret);

    return 0;
}

验证

编译程序,记得加库-pthread

#编译代码,记得-pthread
ubuntu@U:~/study/pthread$ gcc pthread_test.c -pthread
ubuntu@U:~/study/pthread$

执行程序

#执行代码
ubuntu@U:~/study/pthread$ ./a.out 
feng
tid is 2908280576
thread1 exit code 7
ubuntu@U:~/study/pthread$

往期 · 推荐

实时系统vxWorks - 任务(重要)

实时系统vxWorks - 加载应用程序的方法

实时系统vxWorks - 在线调试

实时系统vxWorks - 虚拟机环境搭建

实时系统vxWorks - zynq7020移植vxWorks

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

浅谈linux - 线程的基本应用 的相关文章

  • 实时系统vxWorks-Zynq7020 emio使用

    概述 上一篇文章 小编已经向大家展示了如何在zynq上移植vxWorks系统 接下来将为大家展示如何编写vxWorks应用程序来操作emio 注意 开发环境 vxWorks6 9 4 workbench3 3 5 开发板 TLZ7x Eas
  • 实时系统vxWorks-Zynq7020 axi gpio使用

    概述 这篇文章将为大家展示如何编写vxWorks应用程序来操作axi gpio 注意 开发环境 vxWorks6 9 4 workbench3 3 5 开发板 TLZ7x EasyEVM A3 详细操作方法参见文章 实时系统vxWorks
  • 实时系统vxWorks-Zynq7020 axi timer pwm使用

    概述 这篇文章将为大家展示如何编写vxWorks应用程序来操作axi timer pwm功能 注意 开发环境 vxWorks6 9 4 workbench3 3 5 开发板 TLZ7x EasyEVM A3 详细操作方法参见文章 实时系统v
  • Spring框架基础看这一篇就够

    第一章Spring的概念 spring全家桶 xff1a Spring SpringMVC SpringBoot SpringCloud Spring 出现在2002年左右 xff0c 解决企业开发难度 xff0c 减轻对项目模块之间的管理
  • 实时系统vxWorks-Zynq7020 PL中断使用(重要)

    概述 在任何嵌入式设计中 中断都是必不可少的部分 采用中断系统可以提高计算机系统效率 维持系统可靠正常工作 满足实时处理要求 提供故障现场处理手段 注意 开发环境 vxWorks6 9 4 workbench3 3 5 开发板 TLZ7x
  • 实时系统vxWorks-Zynq7020 axi uart使用

    概述 UART是通用异步收发传输器 Universal AsynchronousReceiver Transmitter 在嵌入式设计中 通常用于主机与辅助设备通信 注意 开发环境 vxWorks6 9 4 workbench3 3 5 开
  • 实时系统vxWorks - 信号量(重要)

    概述 信号量是VxWorks任务间进行通信 同步和互斥的最优选择 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 注意 vxworks提供二进制信号量 互斥信号量 计数信号量 读写信号量4种类型的信号量 二进制信号量 主要用于任
  • 实时系统vxWorks-Zynq7020 自定义axi ip核

    概述 AXI Advanced eXtensible Interface 协议主要描述了主设备 Master 和从设备 Slave 之间的数据传输方式 主设备和从设备之间通过握手信号建立连接 当主设备的数据准备好时 会发出和维持VALID信
  • 实时系统vxWorks - Shell命令

    概述 在开发调试中 Shell总是作为目标机的输入和输出终端 用户可以通过Shell在主机端输入命令 也可以在Shell窗口中看到目标机输出的内容 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小编所有文章均
  • 实时系统vxWorks - 环形缓冲

    概述 Vxwroks 环形缓冲模块主要定义在rngLib c和rngLib h中 对于数据结构比较了解的小伙伴应该知道 环形缓冲实际就是一个双向循环队列 注意 关于循环队列 小编之前在 也没想象中那么神秘的数据结构 先来后到的 队列 循环队
  • 听说Zynq-Zynq7 Processing System配置导入导出

    概述 zynq开发中 我们如何才能将一个工程的Zynq Process System快速准确的配置到另一个工程 这里就需要我们对Zynq7 Processing System ip核的配置导入导出 注意 开发环境 vivado2018 2
  • 实时系统vxWorks - 动态库、静态库建立及调用

    概述 静态库的本质就是将多个目标文件打包成一个文件 在使用时链接静态库就是将库中被调用的代码复制到调用模块中 动态库又名共享库 和静态库最大的不同就是 链接共享库并不需要将库中被调用的代码复制到调用模块中 相反被嵌入到调用模块中的仅仅是被调
  • 实时系统vxWorks - 多任务调试手段

    概述 nbsp 对于vxWorks而言 任务可以说是我们项目工程中不可或缺的组成部分 在实际应用中 我们不可能所有工作都放在一个任务中完成 这样势必会建立多个任务 此时就需要我们对每个任务具备一定的调试手段 注意 开发环境 vxWorks6
  • 实时系统vxWorks - 添加头文件路径的方法

    概述 因为模块化的编程思想 在实际项目工程中往往会存在大量的不同功能的模块 这种模块的体现形式就是不同文件名的源文件和头文件 当我们调用自己写的头文件时 大多数时候需要指定头文件路径 否则编译会出错 注意 开发环境 vxWorks6 9 4
  • 华为开发者大会总结——个人总结

    方舟编译器 xff08 开源 xff09 xff1a 干掉Java虚拟机 将java代码直接编译成机器码 xff0c 静态语义好编译 xff0c 核心是静态编译出动态语义 xff08 通过华为编译实验室的核心专利 xff09 xff0c 代
  • 二叉树遍历应用——计算节点个数与树的高度

    二叉树的节点个数等于左子树的节点数加上右子树的节点数再加上根节点数1 递归算法 xff1a span class token keyword template span span class token operator lt span s
  • 实时系统vxWorks - 增加删除ip

    概述 实际应用中 相信各位小伙伴都遇到过以下的情况 只有一个网络端口 但是想要与多台设备通讯 而不同的设备网段又不一样 这个时候需要频繁的修改自己的ip地址 显得很不方便 windows系统下 操作系统为我们提供了一种可以添加多个ip地址的
  • 实时系统vxWorks - 多IP系统UDP通讯

    概述 在 实时系统vxWorks 增加删除ip 一文中 小编已经向大家展示了如何在网口上添加多个IP 接下来将为大家展示如何编写代码绑定各个IP进行UDP通讯 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小
  • 实时系统vxWorks - 配置多网口

    概述 本文提供在系统运行中对网口进行配置的方法 注意 开发环境 vxWorks6 9 4 workbench3 3 5 1 之前小编网上找相关资料时 有博主说使用新增网口不能与已存在的网口处于同一网段 不过经过小编的测试 两个网口ip可以处
  • 听说Zynq-uboot命令行

    概述 本文主要介绍在linux中uboot命令行的一些常见命令使用方法 注意 开发板 TLZ7x EasyEVM A3 另外 小编所有文章均是自己亲手编写验证 由于文件太多 小编就不在公众号后台一一回复列举了 若需要小编的工程代码 请关注公

随机推荐

  • 听说Zynq-通过tftp加载镜像

    概述 本文主要介绍在linux中如果通过tftp加载启动镜像 以及将启动方式固话到uboot程序中 注意 开发板 TLZ7x EasyEVM A3 另外 小编所有文章均是自己亲手编写验证 由于文件太多 小编就不在公众号后台一一回复列举了 若
  • 浅谈linux - virtual box设置共享文件夹

    概述 本文用于展示在virtual box虚拟机创建共享文件夹 xff0c 实现windows和ubuntu文件互传 注意 开发环境 xff1a VirtualBox 6 1 ubuntu 16 04 另外 xff0c 小编所有文章均是自己
  • 浅谈linux - 搭建nfs服务

    概述 本文用于展示如何搭建nfs服务 xff0c 实现开发机和目标机之间的文件共享 注意 开发环境 xff1a ubuntu 16 04 xff0c linux 4 9 xff0c 开发板 xff1a TLZ7x EasyEVM A3 另外
  • 听说Zynq-petalinux编译linux程序

    概述 PetaLinux 是一种嵌入式 Linux 软件开发套件 SDK 主要用于赛灵思 FPGA 基片上系统设计 注意 开发环境 linux4 9 VirtualBox 6 1 ubuntu 16 04 开发板 TLZ7x EasyEVM
  • 实时系统vxWorks - udp组播通讯

    概述 组播又称多目标广播 多播 网络中使用的一种传输方式 它允许把所发消息传送给所有可能目的地中的一个经过选择的子集 即向明确指出的多种地址输送信息 是一种在一个发送者和多个接收者之间进行通信的方法 注意 开发环境 vxWorks6 9 4
  • 实时系统vxWorks - tcp客户端通讯

    概述 传输控制协议 TCP Transmission Control Protocol 是一种面向连接的 可靠的 基于字节流的传输层通信协议 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小编所有文章均是自己
  • nvm导致React Native启动失败

    错误如下 xff1a The following build commands failed PhaseScriptExecution CP User Generate Specs Users qiaohao Library Develop
  • 实时系统vxWorks - tcp服务器通讯

    概述 接上一篇文章 本文主要展示vxWorks下TCP服务器的编程方法 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小编所有文章均是自己亲手编写验证 由于文件太多 小编就不在公众号后台一一回复列举了 若需要
  • 开发工具 - 离线安装VS code插件

    概述 VSCode具有丰富的插件库 xff0c 程序猿们可以根据自己需要安装插件 xff0c 大大提高VS code工具的生产力 注意 开发环境 xff1a Ubuntu 16 04 xff0c 开发板 xff1a TLZ7x EasyEV
  • 开发工具 - 设置vs code主题

    概述 不可否认 xff0c 良好的界面风格能给程序员带来更好的软件体验 对于小编这种颜值至上的人来说 xff0c 一个高颜值的软件会让人心情愉悦 xff0c 编写代码效率提高 这也是VS code和Source Insight软件的对比优势
  • 开发工具 - 设置vs code显示中文

    概述 本文主要针对像小编一样对于英文看着比较吃力的小伙伴 xff0c 如果你对自己英文很有信心 xff0c 那么建议忽略此文章 注意 开发环境 xff1a Ubuntu 16 04 xff0c 开发板 xff1a TLZ7x EasyEVM
  • 通信协议 - ntp时间同步

    概述 NTP Network Time Protocol xff09 网络时间协议基于UDP xff0c 用于网络时间同步的协议 xff0c 使网络中的计算机时钟同步到UTC xff0c 再配合各个时区的偏移调整就能实现精准同步对时功能 提
  • 通信协议 - ARINC615A加卸载协议

    概述 ARINC615A加卸载端系统由加载端软件和目标端软件组成 xff0c 通过加载端软件和目标端软件的通信共同完成端系统设备的数据加卸载功能 加载端软件运行于大容量设备中 xff0c 被加载端即目标端软件运行于AFDX交换机内和其他端系
  • 我用C语言玩对象,封装相似算法的策略模式

    概述 在策略模式 xff08 Strategy Pattern xff09 中 xff0c 一个类的行为或其算法可以在运行时更改 这种类型的设计模式属于行为型模式 在策略模式中 xff0c 我们创建表示各种策略的对象和一个行为随着策略对象改
  • 浅谈linux - 库文件制作与使用

    概述 本质上来说 xff0c 库文件就是可执行代码的二进制形式 xff0c 可以被操作系统载入内存中执行 Linux操作系统支持的函数库分为静态库和动态库 xff0c 动态库又称共享库 Linux系统有几个重要的目录存放相应的函数库 xff
  • 浅谈linux - vs code搭建运行调试环境

    概述 在Linux开发过程中 xff0c 用不惯vim的用户往往会选择vs code软件或者source insight软件编写相关的源代码 xff0c 由于vs code对linux系统的支持及界面的美观 xff0c 所以小编往往会选择使
  • 浅谈linux - samba实现linux与windows文件共享

    概述 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件 xff0c 而SMB是Server Message Block的缩写 xff0c 即为服务器消息块 xff0c SMB主要是作为Microsoft的网络通讯协
  • mysql的update、delete、和insert into时表别名用法

    mysql数据库update delete 和insert into表的时候 xff0c 如果要使用表别名 xff0c 必须按照规范写法来写 xff1a insert xff1a 简写 xff1a insert into t a a a i
  • 浅谈linux - RT Linux解决方案

    概述 RT Linux Real Time Linux 亦称作实时 Linux xff0c 是 Linux 中的一种硬实时操作系统 xff0c 它最早由美国墨西哥理工学院的 V Yodaiken 开发 产品资料提供的 Linux RT 内核
  • 浅谈linux - 线程的基本应用

    概述 线程 xff08 英语 xff1a thread xff09 是操作系统能够进行运算调度的最小单位 它被包含在进程之中 xff0c 是进程中的实际运作单位 注意 线程和进程之间的区别 1 线程是执行的基本单位 xff1b 进程是资源分