浅谈linux - 线程的基本应用

news2024/11/26 4:54:52

概述

线程(英语: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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Eureka】【源码+图解】【七】Eureka的下线功能

【Eureka】【源码图解】【六】Eureka的续约功能 目录6. 下线6.1 shutdown()6.2 服务端cancel6.3 同步其他server节点6. 下线 主动下线方式 服务端&#xff1a;/eureka/apps/{application.name}/{instance-id}&#xff0c;以本系列文章的helloworld为例&#xff0c;发送DELETE…

程序员学习 CPU 有什么用?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了计算机的冯诺依曼架构&#xff0c;以及计算机的五大部件&#xff1a;控制器、运算器、存储器、输入…

最全面的Spring教程(五)——文件上传与下载

前言 本文为 【SpringMVC教程】文件上传与下载 相关知识&#xff0c;具体将对使用MultipartResolver处理文件上传的步骤&#xff0c;两种文件下载方式&#xff08;直接向response的输出流中写入对应的文件流、使用 ResponseEntity<byte[]>来向前端返回文件&#xff09;等…

老油条表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

降价背后,函数计算规格自主选配功能揭秘

作者&#xff1a;吴森梵&#xff08;仰森&#xff09; 在刚刚结束的 2022 杭州 云栖大会上&#xff0c;阿里云宣布函数计算 FC 开启全面降价&#xff0c;vCPU 单价降幅 11% &#xff0c;其他的各个独立计费项最高降幅达 37.5% 。函数计算 FC 全面降价&#xff0c;让 Serverle…

【Pandas数据处理100例】(七十五):Pandas的where()函数使用方法

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

线程篇(JAVA)

&#x1f495;前言&#xff1a;作者是一名正在学习JAVA的初学者&#xff0c;每天分享自己的学习笔记&#xff0c;希望能和大家一起进步成长&#x1f495; 目录 线程&#xff08;重点&#xff09; 第一种线程的实现 第二种线程的实现 线程的执行原理 线程的生命周期 休眠 …

醇酰基转移酶基因对猕猴桃酯生物合成的作用

文章信息 题目&#xff1a;Alcohol acyl transferase genes at a high-flavor intensity locus contribute to ester biosynthesis in kiwifruit 刊名&#xff1a;Plant Physiology 作者&#xff1a;Edwige J F Souleyre et al. 单位&#xff1a;New Zealand Institute for…

工业互联网数据监测预警解决方案

一、工业互联网数据安全趋势 随着“云、大、物、移、智”等新一代信息技术与制造业的融合发展&#xff0c;数字化生产、网络化协同、个性化定制、服务化延伸等生产运营模式逐渐成为常态&#xff0c;工业互联网数据不断走向开放流动。但原本封闭在工业现场的数据上网上云会带来…

论互联网公司的盈利能力

这个月&#xff0c;互联网公司三季度财报基本披露完毕。其中的共同点是都开始降本增效&#xff0c;提升盈利能力&#xff08;或者还在努力扭亏为盈&#xff09;。互联网公司基本是面向C端消费者的&#xff0c;京东创始人刘强东曾提出一个贯穿消费行业的“十节甘蔗”理论&#x…

[附源码]计算机毕业设计springboot健身房预约平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【剧前爆米花--爪哇岛寻宝】面向对象的三大特性——封装、继承以及多态的详细剖析(中——多态)。

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于Java面向对象三大特性——多态的文章&#xff0c;在本篇文章中我会分享多态的一些基础语法以及类在继承时代码的底层逻辑和执行顺序。 目录 多态的定义及实现条件 多态…

AWS动手实验 - 创建一个Web3网站

实验操作和录播 亚马逊云科技开发者社区 注意事项 按照操作手册进行即可&#xff0c;需要注意到的几个地方&#xff1a; 1&#xff1a;EC2 的 scale 可以不用设置为large那么高&#xff0c;small就够用了。 2&#xff1a;创建堆栈&#xff0c;是点击这个那个按钮&#xff0…

水土保持监测,无人机倾斜摄影该如何做?

水土监测在传统监测方法中存在着许多监测死角。近年来&#xff0c;随着无人机的普及&#xff0c;无人机倾斜摄影三维建模技术在水土保持领域发挥了巨大作用。 我国具有地形地貌范围广&#xff0c;地质情况复杂等特点&#xff0c;每年地质灾害造成很多人员伤亡和财产损失&#…

数商云SCM管理系统库存管理功能助力新能源汽车企业仓储管理更高效

在全球电动化浪潮下&#xff0c;新能源汽车近年来迎来快速发展&#xff0c;但同时&#xff0c;随之而来其面临的关键零部件供应链安全问题也愈来愈突出&#xff0c;新能源汽车供应链格局正在面临重塑&#xff0c;保障新能源汽车产业健康发展仍需持续发力。 随着国际形势突变&a…

Markdown基本语法

描述 Markdown 是一种轻量级的「标记语言」&#xff0c;可读、直观、学习成本低。 1. 强调 1.1 斜体&#xff08;单*、单_&#xff09; 例&#xff1a; *AlexYY* _AlexYY_ 效果&#xff1a; AlexYY AlexYY 1.2 加粗&#xff08;双*、双_&#xff09; 例&#xff1a; *Ale…

python常用代码总结2

1、列表的常规追加元素、追加列表操作 (1)列表追加多个元素&#xff0c;比如追加0-9 ls [] ls.extend(list(range(10)))ls Out[20]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (2)列表追加多个相同的元素&#xff0c;比如追加10个0 ls1 [] for i in range(10):ls1.append(0)ls1 Ou…

如何通过链路追踪进行定时任务诊断

作者&#xff1a;千习 背景简介 什么是定时任务 定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术方案》。 https://developer.aliyun.com/article/882393 什么是链路追踪 随着分布式…

[附源码]计算机毕业设计springboot基于微信小程序的网络办公系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

zookeeper集群环境搭建及使用

文章目录前提条件下载解压配置文件集群配置测试常用命令前提条件 操作系统&#xff1a;CentOS7服务器&#xff1a;3台Java环境&#xff1a;JDK1.8。安装教程参考JDK1.8安装 下载 执行cd /usr/local进入安装的目录执行命令wget https://archive.apache.org/dist/zookeeper/zo…