Linux C 线程

线程

  • 概述
    • 线程和进程的异同
    • 如何选择使用进程还是线程
  • 函数
    • 获取进程自身ID  pthread_self
    • 创建线程  pthread_create
    • 退出线程  pthread_exit
    • 线程等待  pthread_join
  • 四种线程模型
    • 1 )单线程
    • 2 )单线程
    • 3 )双线程
    • 4 )三线程

概述

  线程(英语:thread)是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
在这里插入图片描述

线程和进程的异同

包含关系:
  每个进程至少有一个线程,这些线程共享进程的所有资源,线程本身只拥有自己的栈空间。
控制块:
  线程是TCB,进程是PCB。
基本单位:
  进程——资源分配的最小单位,线程——程序执行的最小单位。(面试)
状态:
  进程和线程一样都拥有阻塞态、就绪态、运行态。
在Linux中的编译指令:
  进程使用 gcc xxx.c -o xxx
  线程使用 gcc xxx.c -lpthread -o xxx

如何选择使用进程还是线程

①需要频繁创建销毁的优先使用线程,因为对进程来说创建和销毁一个进程代价是很大的。
②切换频繁和耗时操作用线程,因为程的切换速度快,应用程序的响应快。
③多机分布的用进程,多核分布用线程,因为对 CPU 系统的效率使用上线程更占优。
④并行操作时使用线程,如 C/S 架构的服务器端并发线程响应用户的请求。
⑤需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

函数

获取进程自身ID  pthread_self

头文件:
  #include <pthread.h>
函数原型:pthread_t pthread_self(void);
返回值:进程自身的 ID。

	pthread_t pid = pthread_self();

创建线程  pthread_create

头文件:
  #include <pthread.h>
函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数介绍:
  thread: 子线程ID。
  attr:分离属性与非分离属性。
在这里插入图片描述
  void *(*start_routine) (void *):线程服务函数。
  arg:线程函数的参数
返回值:成功返回 0 失败返回 error。

分离与非分离属性:
分离:分离一个正在运行的线程并不影响进程,仅仅是通知当前系统该线程结束时,其所属的资源可以回收;分离的线程在终止时会保留它的虚拟内存,包括他们的堆栈和其他系统资源,有时这种线程被称为“僵尸线程”。
非分离:如果线程具有非分离属性,进程终止时会被立刻回收将释放掉所有线程。终止时未释放的系统资源和进程资源,不保存线程返回值的内存空间、堆栈、寄存器等。

void * pthread_fun(void * arg)
{}pthread_t pid;pthread_create(&pid,NULL,pthread_fun,NULL);

退出线程  pthread_exit

头文件:
  #include <pthread.h>
函数原型:void pthread_exit(void *retval);
参数介绍:
  retval:返回值地址。

void * pthread_fun(void * arg)
{pthread_exit(NULL);
}

线程等待  pthread_join

头文件:
  #include <pthread.h>
函数原型:int pthread_join(pthread_t thread, void **retval);
参数介绍:
  thread:等待线程的 ID
  Retval:返回值。
返回值:成功返回 0,失败返回 error。

	pthread_join( pid , NULL );

四种线程模型

注:下面图中的pc为pthread_create简写。

1 )单线程

执行顺序:
main → fun1 → fun2 → fun3 → mainend
此模型中只有一个线程,所有的函数线程id相同。
在这里插入图片描述

2 )单线程

执行顺序:
main → fun1 → fun2 → fun1end → fun3 → mainend
此模型中只有一个线程,所有的函数线程id相同。
在这里插入图片描述

3 )双线程

执行顺序:
main → fun2 → fun3 → mainend
 ↓pc(fun1)
fun1 → fun1end
此模型中有俩个线程。
在这里插入图片描述

4 )三线程

执行顺序
main → fun3 → mainend
 ↓pc(fun1)
fun1 → fun1end
 ↓pc(fun2)
fun2 → fun2end
此模型中有三个线程。
在这里插入图片描述

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

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

相关文章

【HarmonyOS】低代码平台组件拖拽使用技巧之列表

【关键字】 HarmonyOS、低代码平台、组件拖拽、列表、列表项 1、写在前面 我们在日常开发中使用最多的组件可能就是列表组件了&#xff0c;现在几乎所有的应用都离不开列表&#xff0c;那么今天我们就来介绍一下如何利用低代码平台来实现列表的展示&#xff0c;列表实际上也是…

HALCON根据需要创建自定义函数

任务要求&#xff1a; 创建函数myfun(a,b,c)&#xff0c;输入浮点数a&#xff0c;b的值&#xff0c;计算c a b&#xff0c;将计算结果返回。 操作步骤&#xff1a; 1&#xff09;打开HDevelop程序 2&#xff09;打开函数菜单&#xff0c;选择“创建新函数”&#xff0c…

中间件安全:Apache Tomcat 文件上传.(CVE-2017-12615)

中间件安全&#xff1a;Apache Tomcat 文件上传. 当存在漏洞的 Tomcat 运行在 Windows / Linux 主机上&#xff0c;且启用了 HTTP PUT 请求方法(例如&#xff0c;将 readonly 初始化参数由默认值设置为ialse) &#xff0c; 攻击者将有可能可通过精心构造的攻击请求数据包向服务…

java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90 给定一个NN的矩阵matrix&#xff0c;把这个矩阵调整成顺时针转动90后的形式。 顺时针转动90后为&#xff1a; 【要求】额外空间复杂度为O&#xff08;1&#xff09;。 public void rotate(int[][] matrix) {int tR 0; // 左上角行坐标int tC 0;…

oracle 19c 创建物化视图并测试logminer进行日志挖掘

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 1、创建物化视图 alter session set container…

解锁无限可能性:探索Amazon Lightsail的便捷云计算服务

解锁无限可能性&#xff1a;探索Amazon Lightsail的便捷云计算服务 在数字化时代&#xff0c;云计算成为推动创新和业务发展的关键驱动力。Amazon Lightsail 作为 Amazon Web Services&#xff08;亚马逊云科技&#xff09;家族中的一员&#xff0c;为小型企业和创业公司提供了…

深度剖析倍增算法求解最近公共祖先(LCA)的细枝末节

1. LCA&#xff08;最近公共祖先&#xff09; 倍增算法的基本思想在前面的博文中有较详细的介绍&#xff0c;本文不再复述。此文仅讲解如何使用倍增算法求解多叉树中节点之间的最近公共祖先问题。 什么是最近公共祖先问题&#xff1f; 字面而言&#xff0c;指在树上查询两个…

linux CentOS7 安装git 配置秘钥公钥克隆代码

第一步&#xff1a;安装git yum -y install git #查看版本 git --version 第二步&#xff1a;配置git信息 git config --global user.name "username" git config --global user.email "XXXXX.com" 第三步&#xff1a;生成密钥和公钥&#xff0c; 后…

裸片-PCBA

裸片 PCBA&#xff0c; 薄膜&#xff0c; 邦定-COB&#xff08;chip on board&#xff09;技术是指将裸芯片直接贴在PCB 板上&#xff0c;然后用铝线或金线进行电子连接的技术

golang 断点调试

1.碰见如下报错,调试器没有打印变量信息 Delve is too old for Go version 1.21.2 (maximum supported version 1.19) 2. 解决办法 升级delve delve是go语言的debug工具。 go install github.com/go-delve/delve/cmd/dlvlatest报错 Get “https://proxy.golang.org/github…

数据驱动-DDT

数据驱动-DDT 说明 自动化测试中&#xff0c;数据驱动是很重要的一个点实际项目中&#xff0c;肯定会出现这种情况&#xff1a;多条测试用例的执行步骤&#xff0c;断言步骤完全一致&#xff0c;只有输入和输出数据不一样这个时候依靠数据驱动&#xff08;数据参数化&#xf…

关于爬虫!看这一篇就够了!

作为一个互联网的技术开发&#xff0c;爬虫不管是自己写的还是所负责的网站被爬&#xff0c;都是挺常见的。 但是一个很常见的东西&#xff0c;却一直没有系统梳理过&#xff0c;今天我们从发展历史&#xff0c;价值&#xff0c;问题和应对恶意爬虫的策略来聊一聊爬虫。 1 爬…

MKRTOS MCU上的微内核操作系统

MKRTOS 全称是 Micro-Kernel Real-Time Operating System&#xff0c;中文名字是微内核实时操作系统。MKRTOS 是首款在开源的支持MCU的微内核操作系统。未来还将在MCU上支持虚拟化&#xff01;&#xff01;下载地址&#xff1a;https://gitee.com/IsYourGod/mkrtos-realMKRTOS被…

数据仓库:架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …

Camtasia2024喀秋莎软件注册机

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

企业办公文件数据防泄密系统 | 文件、文档、设计图纸、源代码、音视频等核心数据资料防止外泄!

天锐绿盾防泄密软件采用智能透明加密技术&#xff0c;对文件、文档、图纸、源代码、音视频等数据进行加密保护&#xff0c;防止数据泄露。这种加密技术是内核级透明加密技术&#xff0c;可以在不影响员工正常工作的情况下&#xff0c;对需要保护的数据进行加密操作。 PC端访问地…

小程序授权获取昵称

wxml: <form bindsubmit"formsubmit"><view style"width: 90%;display: flex;margin-left: 5%;"><view class"text1">昵称&#xff1a;</view><input style"width: 150px;margin-left: 30px;margin-top: 30px;…

Harmony Ble 蓝牙App (一)扫描

Harmony Ble 蓝牙App &#xff08;一&#xff09;扫描 前言正文一、创建工程二、工程配置① 权限配置② Debug配置③ UI配置 三、扫描① 扫描接口② 扫描类 四、业务处理① Slice的生命周期② 蓝牙开关和动态权限请求 五、扫描设备六、显示设备① 自定义蓝牙类② 提供者③ 显示…

cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory

目录 问题描述问题分析解决方案容器时区验证开源项目微服务商城项目前后端分离项目 问题描述 使用下面的 Dockerfile 为 youlai-boot 项目制作镜像设置容器时区报错。 # 基础镜像 FROM openjdk:17-jdk-alpine # 时区修改 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc…

力扣C++学习笔记——C++ assign全面解析

cassign是一个C20标准中新增的头文件&#xff0c;主要提供了assign函数&#xff0c;用于将一个容器内的元素按照特定规则赋值到另一个容器中。它是STL容器操作的重要一环&#xff0c;具有高效、简洁、易用的特点。 assign函数有多个版本&#xff0c;一般使用的是容器类型相同或…