Linux 操作系统线程1

news2024/12/26 14:17:55

目录

一、线程

1.1线程的基本概念

1.2 线程相关的API函数

1.2.1  线程的创建

1.2.2  线程退出

1.2.3  线程等待函数

1.2.4  获取线程ID

1.2.5 线程取消

1.2.6 线程的清理函数


一、线程

1.1线程的基本概念

线程是属于进程;一个进程可以有多个线程;

线程的作用就是:解决多任务并发运行

进程和线程的区别:
        1.和进程相比, 它是一种非常“节俭” 的多任务操作方式( 启动一个进程所花费的空间
远远大于启动一个线程所花费的空间( 30 倍左右) , 而且, 线程间彼此切换所需的时间也远小于进程间切换所需要的时间( >10 倍) ) 。 在 linux 系统中建立一个新的进程必须分配给它独立的地址空间, 建立众多的数据表来维护它的代码段、 堆栈段和数据段等。 而运行于同一个进程的多个线程, 它们之间使用相同的地址空间, 而且线程间彼此切换所需的时间也远小于进程间切换的时间。

        2.线程间方便的通信机制。 对于不同进程,它们有独立的数据空间 数据的交互只能使
用进程通信 的方式, 这种方式费时, 而且不方便。 但是同一个进程下的线程之间共享数据空间, 所以一个线程的数据可 以直接为其他线程所有, 快捷, 方便。

线程的缺点:一个线程的非正常死亡,会导致进程退出,进而所有的线程均会死亡。

线程和进程在使用上各有优缺点:

        线程执行开销小, 占用的 CPU 资源少, 线程之间的切换快,但不利于资 源的管理和保护; 而进程正相反。 从可移植性来讲, 多进程的可移植性要好些。 要注意的是 由于线程共享了进 程的资源和地址空间, 因此, 任何线程对系统资源的操作都会给其他线程带来影响, 同时编写多线程程序, 最复 杂的事情是处理好各线程对共享资源的访问控制。

如何选择使用进程和线程:

        1) 需要频繁创建销毁的优先用线程,因为对进程来说创建和销毁一个进程代价是很大的。
        2)线程的切换速度快, 所以在需要大量计算, 切换频繁时用线程, 还有耗时的操作使用线程可高应用程序的响应;
        3) 强相关的处理用线程, 弱相关的处理用进程;
        4) 因为对 CPU 系统的效率使用上线程更占优, 所以可能要发展到多机分布的用进程, 多核分用线程;
        5) 需要更稳定安全时, 适合选择进程; 需要速度时, 选择线程更好。
        6) 如果线程和进程都各有优势和劣势, 选你喜欢的/你擅长的

1.2 线程相关的API函数

在wubantul inux操作系统上使用线程库函数需要进行调用,

gcc main -o main -lpthread

1.2.1  线程的创建

头文件:#include<pthread.h>

函数原型:

int pthread_create(
        pthread_t *restrict_thread, //线程号 %lu
        const pthread_attr_t *restrict_attr, //NULL
        void *(*start_routine)(void*), //函数指针, 传函数名即可
        void *restrict arg); //传给上一个参数的参数

参数:

        线程ID  //unsigned long

        线程属性  //  NULL

        线性入口函数

        传递给线程入口函数的参数

返回值:

成功返回0    失败返回错误号(非0)

1.2.2  线程退出

头文件:#include<pthread.h>

函数原型:

void pthread_exit(void *value_ptr);

参数:保存线程退出的状态

1.2.3  线程等待函数

头文件:#include<pthread.h>

函数原型:

int pthread_join(pthread_t thread, void **value_ptr);

作用:等待指定的线程退出,该函数是一个阻塞函数,一直等到参数pthid指定的线程返回;与多进程中的wait 或 waitpid 类似

参数:

要等待的线程ID

保存线程退出的状态 一般指定NULL

返回值:成功返回0,失败返回非0

1.2.4  获取线程ID

函数原型:

pthread_t pthread_self(void)

返回值:线程号,不同的线程有不同的线程号,但是线程号是相同的

1.2.5 线程取消

作用:取消一个还没有运行完的线程

函数原型:

int pthread_cancel(pthread_t thread);

参数:thread: 线程号

1.2.6 线程的清理函数

作用:有时候希望线程退出时能自动的执行某些函数

函数原型:

void pthread_cleanup_push(void (*routine)(void*), void *arg); 是清理注册函数
void pthread_cleanup_pop(int execute);是执行函数, 只有里面的参数 execute=1 才会执行

注意:这两个函数都是成双成对出现的,不能单独使用。

参数:

        routine: 注册清理的函数的指针
        arg: 传递给清理函数的参数
        execute: 决定这个清理函数是否被调用
        有三种情况线程清理函数会被调用:
                线程还未执行 pthread_cleanup_pop 前, 被 pthread_cancel 取消
                线程还未执行 pthread_cleanup_pop 前, 主动执行 pthread_exit 终止
                线程执行 pthread_cleanup_pop, 且 pthread_cleanup_pop 的参数为 1

线程的清理函数中的顺序和栈一样,满足先后出。

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

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

相关文章

【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?

梯度下降算法是一种常用的优化方法&#xff0c;用于最小化损失函数以训练模型。然而&#xff0c;在使用梯度下降算法时&#xff0c;可能会面临以下局部最优问题。 &#xff08;一&#xff09;非凸函数的局部极小值 问题描述&#xff1a;在复杂的损失函数中&#xff0c;如果目…

5.2 Java全栈开发前端+后端(全栈工程师进阶之路)-服务端框架-Spring框架-相信我看这一篇足够

1.Spring框架 1.1.Spring框架简介 Spring是一个基于java的轻量级的、一站式框架。 虽然Spring是一个轻量级框架&#xff0c;但并不表示它的功能少。实际上&#xff0c;spring是一个庞然大物&#xff0c;包罗万象。 时至今日&#xff0c;Spring已经成为java世界中事实上的标准…

代码随想录算法训练营第36期DAY24

DAY24 235二叉搜索树的最近公共祖先 迭代法&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio…

笔记本电脑怎么多选删除文件?误删除文件怎么办

在日常使用笔记本电脑中&#xff0c;我们可能会遇到需要删除大量文件的情况&#xff0c;例如清理临时文件、整理文档或卸载不再需要的程序。手动一个一个地删除不仅效率低下&#xff0c;还可能遗漏某些文件。那么&#xff0c;如何在笔记本电脑上高效地进行多选删除操作呢&#…

C补充1—1章1.0—C程序语言设计(许宝文,李志)

二手书到了&#xff0c;好消息&#xff0c;前主人看的很认真&#xff0c;坏消息&#xff0c;只看到这页了 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后几题好难啊啊啊啊啊&#xff0c;再议 目录 1.1 入门 1.2 变量与算数表达式 练习1-3 //打印温度对照表 练习1-4 //摄氏-华氏温…

vscode 实现本地服务器部署小结

在查阅 MDN 网站的时候&#xff0c;偶然发现的原来 vscode 也可以实现本地化服务器部署&#xff0c;来模拟服务器的运行。 安装插件 在VSCode的插件市场搜索并安装以下插件&#xff1a; – Live Server&#xff08;用于开启本地服务器&#xff09; – Debugger for Chrome&a…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时&#xff0c;报错说 docker-compose 命令找不到&#xff0c;在网上试了一些安装方法&#xff0c;良莠不齐&#xff0c;所以在这块整理一下&#xff0c;如何正确快速的安装 docker-compose cd…

英飞凌TC3xx 启动逻辑梳理(1)

目录 1.启动时序总览 2.Boot Firmware干了什么&#xff1f; 2.1 BMHD梳理 2.2 HWCFG 2.3 ABM 2.4 BMHD 无效时处理方案 2.5 HSM启动如何影响SSW启动 3.小结 在调TC3xx的板子时&#xff0c;最害怕的就是刷UCB&#xff1b;稍不注意板子就上锁&#xff0c;调试器也连不上了…

BL207分布式I/O模块能源管理系统升级的智慧之选

能源管理领域智能化、网络化趋势的不断深入&#xff0c;如何高效、准确地采集并分析能源消耗数据成为众多企业优化能源利用、降低成本的关键所在。钡铼电子的BL207 BACnet IP分布式远程I/O模块&#xff0c;正是在这样的背景下应运而生&#xff0c;为能源管理系统&#xff08;EM…

zookeeper启动 FAILED TO START

注意&#xff1a;启动zookeeper时&#xff0c;需要使用zkServer.sh start命令将所有主机启动后&#xff0c;再查看状态 如果&#xff0c;启动一台主机&#xff0c;查看当前主机状态&#xff0c;则会报错 如果出错&#xff0c;进入到$ZOOKEEPER_HOME/logs&#xff0c;查看日志 …

C++数据结构——AVL树

前言&#xff1a;本篇文章将紧随二叉搜索树的节奏&#xff0c;分享一个新的数据结构——AVL树。 目录 一.AVL树概念 二.AVL树插入规则 三.AVL树实现 1.基本框架 2.插入 3.旋转 1&#xff09;左\右单旋 2&#xff09;左右/右左双旋 4.遍历 5.求树高度 6.判断平衡 7.…

WireShark对tcp通信数据的抓包

一、抓包准备工作 安装wireshark sudo apt update sudo apt install wireshark 运行 二、WireShark工具面板分析 上图中所显示的信息从上到下分布在 3 个面板中&#xff0c;每个面板包含的信息含义如下&#xff1a; Packet List 面板&#xff1a;显示 Wireshark 捕获到的所…

Vision Mamba:高效视觉表示学习双向状态空间模型,超越Vision Transformer!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 引言&#xff1a;探索视觉领域的新方向 在计算机视觉领域&…

【RSGIS数据资源】1980-2021年中国土地利用覆盖和变化数据集

文章目录 摘要1. 数据集概况2. 数据集组织形式2.1 1980-2015年中国森林覆盖数据集CFCD2.2 1980-2021年中国土地利用覆盖与变化数据集 3. 数据生产服务单位4. 引用 摘要 通过融合森林资源清查数据和20种遥感土地利用产品&#xff0c;重建生成了1980-2015年中国森林覆盖数据集&a…

JAVA大量数据导出excel

背景&#xff1a;因项目需要导出3万行&#xff0c;90列的数据到excel&#xff0c;使用传统的apache poi 直接导出&#xff0c;导致504连接超时无法导出。然后改造方法&#xff0c;异步导出。 一、准备一个导出类&#xff0c;属性有id&#xff0c;outputstrream,finleName,err,e…

五、Redis五种常用数据结构-SET

Redis的Set结构存储的数据和Java中的HashSet类似&#xff0c;都是无序且不重复的。其底层的数据结构有两种&#xff0c;一是当value为整数时&#xff0c;且数据量不大时采用intset来存储。其他情况使用dict字典存储。集合中最多存储232-1(40多亿)个数据。 1、常用命令 sadd k…

Vue中引入Element组件、路由router、Nginx打包部署

目录 1、Element-ui(饿了么ui) 演示&#xff1a; 怎么打开NPM脚本&#xff1f; Vue路由router Nginx打包部署Vue-Cli项目 1、Element-ui(饿了么ui) element-ui(饿了么ui)是一个非常好用且美观的组件库(插件库)&#xff0c;主要用于网站快速成型&#xff0c;由国产团队饿了么…

网工交换基础——VLAN Maping

一、定义 VLAN Maping通过修改报文携带的VLAN Tag来实现不同VLAN的相互映射。 二、应用场景 1、场景一&#xff1a;两个VLAN相同的二层用户网络通过骨干网络互联&#xff0c;为了实现用户之间的二层互通&#xff0c;以及二层协议&#xff08;例如MSTP等&#xff09;的统一部署…

如何内网穿透,远程访问内网设备

文章目录 0.前言1.准备工作2.内网穿透原理3.配置公网服务器的frp5.配置访问内网主机6.配置win10的远程桌面访问&#xff08;win11类似&#xff09;7.参考资料 0.前言 最近想研究一些新东西&#xff0c;公司的机器不敢乱搞&#xff0c;公司测试的服务器安装软件太多&#xff0c…

React - Input框绑定动态State和监听onChange事件,输入时失去焦点

React - Input框绑定动态State和监听onChange事件&#xff0c;输入时失去焦点 一. 案例复现二. 解决方案 一. 案例复现 案例代码如下&#xff1a; import React, { useState } from react; import { Table, Input } from antd; const Column Table.Column; const mockData …