当前位置: 首页 > news >正文

Linux线程2

线程相关函数

线程分离--pthread_detach(后面会详细讲)

函数原型:int pthread_datach(pthread_t thread);   

调用该函数之后不需要 pthread_join 

子线程会自动回收自己的PCB 

杀死(取消)线程--pthread_cancel

取消线程指的是在程序运行时,允许某个线程向另一个正在执行的线程发送一个请求,要求该线程停止当前的工作并尽快终止执行。这个过程并不是立即强制停止线程(因为那可能会导致数据不一致或资源泄露),而是以一种更温和、更可控的方式来实现。

在多线程程序中,有时候我们可能会遇到这样的情况:一个线程正在执行某个任务,但是由于某种原因(比如用户取消了操作、程序状态发生了改变等),我们需要这个线程停止当前的工作。这时候,取消线程就成为了一个必要的操作。

1 首先,你需要确保线程是可取消的。

2 然后,你可以通过调用一个特定的函数(如pthread_cancel)来向目标线程发送一个取消请求。这个请求会告诉线程:“你已经被请求取消了,请尽快停止工作。

3 目标线程需要定期检查是否收到了取消请求。这通常是通过在代码的关键点调用pthread_testcancel()(或类似函数)来实现的。如果在调用pthread_testcancel()时线程已被请求取消,那么线程会立即停止执行并退出。

4 在退出之前,线程应该执行必要的清理工作,比如释放它占用的资源(内存、文件句柄、锁等)。虽然这通常是线程自己的责任,但有时候也需要考虑在外部(比如主线程)进行某些清理工作。

5 一旦线程完成了所有的清理工作,它就会结束执行。此时,如果其他线程正在等待这个线程结束(比如通过pthread_join),那么等待操作也会返回。

函数原型: int pthread_cancel(pthread_t pthread); 

使用注意事项: 在要杀死的子线程对应的处理的函数的内部,必须做过一次系统调用

write read printf int a = 2; int b = a+3;

pthread_testcancel();设置取消点

见详细代码如下:

基本思想:创建,取消,回收

线程取消成功

比较两个线程ID是否相等(预留函数) --pthread_equal

函数原型:    int pthread_equal(pthread_t  t1,pthread_t t2); 

当线程相同时,返回真,线程不同时,返回假

线程分离属性

通过属性设置线程的分离

1.线程属性类型: pthread_attr_t attr;

2.线程属性操作函数:

        对线程属性变量的初始化

                int pthread_attr_init(pthread_attr_t* attr);

        设置线程分离属性

                int pthread_attr_setdetachstate( pthread_attr_t* attr,int detachstate );

参数:

        attr : 线程属性

        detachstate

                PTHREAD_CREATE_DETACHED(分离)                

                PTHREAD_CREATE_JOINABLE(非分离)

释放线程资源函数

        int pthread_attr_destroy(pthread_attr_t* attr);

线程被设置为分离态,在线程结束时会自动释放资源,使用pthread_join()是用来等待非分离态线程结束并回收资源的,所以分离态可以不使用

线程同步

Linux中的线程同步是确保多个线程在访问和操作共享资源时保持数据一致性和正确性的重要机制。在多线程环境中,由于线程是并发执行的,如果多个线程同时访问和修改共享资源,可能会导致数据不一致、竞态条件等问题。因此,线程同步通过协调线程的执行顺序和共享资源的访问来避免这些问题。

线程同步的基本概念

  • 同步:确保多个线程按照预定的顺序或规则来执行,以保证程序的正确性和稳定性。
  • 互斥:防止多个线程同时访问共享资源,确保同一时间只有一个线程能够访问特定资源。

 用同一个简单的例子来解释

线程的ID交错出现,number的值依次增加。所以这两个线程是同步进行的

互斥锁(互斥量)

一、互斥锁(Mutex)概述

互斥锁实现了“互相排斥”(mutual exclusion)的同步机制,禁止多个进程或线程同时进入受保护的代码区域,即“临界区”(critical section)。在任何时刻,只有一个进程或线程被允许进入这样的保护区。互斥锁相对于信号量来说,语义更加简单轻便,执行速度更快,可扩展性更好,并且其数据结构定义也比信号量小。

二、互斥锁的特性
  1. 互斥性:确保同一时间只有一个线程能够访问临界区。
  2. 休眠锁:在锁争用时,可能存在进程的睡眠与唤醒,context的切换带来的代价较高,适用于加锁时间较长的场景。
  3. 自旋等待:在锁被持有时,互斥锁会选择自旋等待(optimistic spinning),而不是立即进行休眠,以提升性能。
  4. 性能与扩展性:与信号量相比,互斥锁的性能与扩展性更好,因此在Linux内核中更受青睐。
  5. 多个线程访问时共享数据时串行的(但是效率较低)。
三、互斥锁的相关函数

在Linux中,互斥锁的实现函数主要通过pthread库提供,这些函数包括:

  1. pthread_mutex_init
    • 功能:初始化一个互斥锁对象。
    • 原型int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
    • 参数mutex 是指向互斥锁对象的指针,attr 是指向互斥锁属性的指针(可以为NULL,表示使用默认属性)。
    • 返回值:成功时返回0,失败时返回错误码。
  2. pthread_mutex_lock
    • 功能:对互斥锁进行加锁操作。
    • 原型int pthread_mutex_lock(pthread_mutex_t *mutex);
    • 参数mutex 是指向已初始化的互斥锁对象的指针。
    • 返回值:成功时返回0,如果互斥锁已被其他线程占用,则调用线程会被阻塞。
  3. pthread_mutex_trylock
    • 功能:尝试对互斥锁进行加锁操作,但不会阻塞当前线程。
    • 原型int pthread_mutex_trylock(pthread_mutex_t *mutex);
    • 参数mutex 是指向已初始化的互斥锁对象的指针。
    • 返回值:成功时返回0,如果锁已被其他线程占用,则返回EBUSY。
  4. pthread_mutex_unlock
    • 功能:对互斥锁进行解锁操作。
    • 原型int pthread_mutex_unlock(pthread_mutex_t *mutex);
    • 参数mutex 是指向已加锁的互斥锁对象的指针。
    • 返回值:成功时返回0。
  5. pthread_mutex_destroy
    • 功能:销毁互斥锁,释放与互斥锁相关的资源。
    • 原型int pthread_mutex_destroy(pthread_mutex_t *mutex);
    • 参数mutex 是指向要销毁的互斥锁对象的指针。
    • 返回值:成功时返回0。

四、原子操作

C P U 处 理 一 个 指 令 , 进 程 / 线 程 在 处 理 完 这 个 指 令 之 前 是 不 会 失 去 C P U 的 就 像 原 子 被 认 为 是 不 可 分 割 颗 粒 一 样

即原子操作是一种在执行过程中不可被中断的操作,主要用于多线程或多进程环境下对共享资源的访问和修改,以确保数据的一致性和可靠性

相关文章:

Linux线程2

线程相关函数 线程分离--pthread_detach(后面会详细讲) 函数原型:int pthread_datach(pthread_t thread); 调用该函数之后不需要 pthread_join 子线程会自动回收自己的PCB 杀死(取消)线程--pthread_cancel 取…...

乱弹篇(40)人类追求长寿

不要认为只有中国的老龄化才严重,实际上全球都面临老龄化,其中日本最为严重。 这是随着人类生活和医学水平的不断提高,寿命才会比过去数十年有了大幅度的提升。据资料显示,目前全球平均预期寿命估计为73岁。与百年之前相比&#…...

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章,小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…...

N4 - Pytorch实现中文文本分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 任务描述步骤环境设置数据准备模型设计模型训练模型效果展示 总结与心得体会 任务描述 在上周的任务中,我们使用torchtext下载了托管的英文的…...

centos 如何安装sox音视频处理工具

要在 CentOS 系统上安装 Sox 音频处理软件,你可以遵循以下步骤。请注意,这些说明适用于 CentOS 7,对于 CentOS 8 及更高版本,某些包管理命令可能略有不同。 第一步:安装所需的依赖库 首先,你需要安装一系列…...

Java语言程序设计——篇十一(2)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...

Linux 应急响应靶场练习 1

靶场在知攻善防实验室公众号中可以获取 前景需要:小王急匆匆地找到小张,小王说"李哥,我dev服务器被黑了",快救救我!! 挑战内容: (1)黑客的IP地址 (2&#xff0…...

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…...

python3.12 搭建MinerU 环境遇到的问题解决

报错: AttributeError: module pkgutil has no attribute ImpImporter. Did you mean: zipimporter? ERROR: Exception: Traceback (most recent call last):File "D:\ipa_workspace\MinerU\Lib\site-packages\pip\_internal\cli\base_command.py", …...

基于SpringBoot+Vue的流浪猫狗救助救援网站(带1w+文档)

基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 该流浪猫狗救助救援网站在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服…...

56_AOP

AOP使用案例 如何进行数据库和Redis中的数据同步?/ 你在项目的那些地方使用了aop?答:可以通过Aop操作来实现数据库和Redis中的数据同步。/ 通过Aop操作来实现数据库和Redis中的数据同步。可以定义一个切面类,通过对控制器下的所有…...

安装了h5py,使用报错ImportError: DLL load failed while importing _errors

使用pip 安装了h5py,但是运行代码报错; from . import _errorsImportError: DLL load failed while importing _errors: 找不到指定的程序。 原因: 可能和不正确安装h5py这个包有关系 解决: pip uninstall h5py 换成使用conda…...

BootStrap前端面试常见问题

在前端面试中,关于Bootstrap的问题通常围绕其基本概念、使用方式、特性以及实际应用等方面展开。以下是一些常见的问题及其详细解答: 1. Bootstrap是哪家公司研发的? 回答:Bootstrap是由Twitter的Mark Otto和Jacob Thornton合作…...

在linux运维中为什么第一道防线是云防火墙,而不是waf

在Linux运维和云计算环境中,第一道防线通常是云防火墙(Cloud Firewall),而不是Web应用防火墙(WAF),主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因: 1…...

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 2024.8.2 12:00————16:00 过题数790/1500 补题数943.33/1500 AB Problem Komorebi的数学课 次佛锅 Setsuna的K数列 Wiki下象棋 黄金律法 天气预报 叠硬币 AB Problem ag…...

多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统

多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统。此套是全新开发的java版多语言抢单系统。 后端java,用的若依框架,这套代码前后端是编译后的,测试可以正常使用,语言繁体,英文,日…...

文件上传——springboot大文件分片多线程上传功能,前端显示弹出上传进度框

一、项目搭建 创建 Spring Boot 项目: 创建一个新的 Spring Boot 项目&#xff0c;添加 Web 依赖。 添加依赖: 在 pom.xml 文件中添加以下依赖: <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId&…...

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…...

SAP-PLM创建物料主数据接口

FUNCTION zplm_d_0001_mm01. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" EXPORTING *" VALUE(EX_TOTAL) TYPE CHAR4 *" VALUE(EX_SUCCESSFUL) TYPE CHAR4 *" …...

超声波眼镜清洗机哪个品牌好?四款高性能超声波清洗机测评剖析

对于追求高生活质量的用户来说&#xff0c;眼镜的清洁绝对不能马虎。如果不定期清洁眼镜&#xff0c;时间久了&#xff0c;镜片的缝隙中会积累大量的灰尘和细菌&#xff0c;眼镜靠近眼部&#xff0c;对眼部健康有很大影响。在这种情况下&#xff0c;超声波清洗机显得尤为重要。…...

卸载Windows软件的正确姿势,你做对了吗?

前言 今天有小伙伴突然问我&#xff1a;她把软件都卸载了&#xff0c;但是怎么软件都还在运行&#xff1f; 这个问题估计很多小伙伴都是遇到过的&#xff0c;对于电脑小白来说&#xff0c;卸载Windows软件真的真的真的是一件很难的事情。所以&#xff0c;今天咱们就来讲讲&am…...

WEB前端14-Element UI(学生查询表案例/模糊查询/分页查询)

Vue2-Element UI 1.可重用组件的开发 可重用组件 我们一般将可重复使用的组件放在components目录之下&#xff0c;以便父组件的灵活调用 <!--可重用组件一般与css密切相关&#xff0c;使用可重用组件的目的是&#xff0c;将相似的组件放在一起&#xff0c;方便使用-->…...

使用swiftui自定义圆形进度条实现loading

实现的代码如下&#xff1a; // // LoadingView.swift // SwiftBook // // Created by Song on 2024/8/2. //import SwiftUIstruct LoadingView: View {State var process 0.5var body: some View {VStack(spacing: 20) {ZStack {Circle().stroke(.gray.opacity(0.3), lin…...

C# 设计模式之抽象工厂模式

总目录 前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的&#xff0c;简单工厂模式的工厂类随着产品类的增加需要增加额外的代码&#xff0c;而工厂方法模式每个具体工厂类只完成单个实例的创建&#xff0c;所以它具有很好的可扩展性。但是在现实生活中&#xff0c…...

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…...

R 语言学习教程,从入门到精通,R的安装与环境的配置(2)

1、R的安装与环境的配置 R语言是一款完全免费且开源的软件&#xff0c;它的开源许可证是GNU通用公共许可证&#xff08;GPL&#xff09;&#xff0c;这意味着任何人都可以自由地使用、复制、修改和发布R语言的源代码&#xff0c;甚至可以将其用于商业用途。 和python等其他语言…...

Python批量下载音乐功能

Python批量下载音乐功能 Python批量下载音乐,调用API接口,同时下载歌曲和歌词 先安排一下要用的模块&#xff0c;导入进来。 import re import json import requests目录结构 下载音乐 Awking_Class.pymusic.txt 文件文件写的是音乐名字,使用换行分割 new_music 注意这个 ne…...

用 Bytebase 实现批量、多环境、多租户数据库的丝滑变更

Bytebase 提供了多种功能来简化批量变更管理&#xff0c;适用于多环境或多租户情况。本教程将指导您如何使用 部署配置 和 数据库组 在不同场景下进行数据库批量变更。 默认流水线 vs 部署配置 图片数据库 vs 数据库组 1. 准备 请确保已安装 Docker&#xff0c;如果本地没有重…...

java之方法引用 —— ::

目录 一、简介 二、引用静态方法 1.格式 2.示例 ​编辑 3.条件解析 三、引用成员方法 1.格式 2.示例 四、引用构造方法 1.格式 2.示例 五、类名引用成员方法 1.格式 2.略微不同的方法引用规则 3.示例 六、引用数组的构造方法 1.格式 2.示例 一、简介 方…...

「测试线排查的一些经验-上篇」 后端工程师

文章目录 端口占用脚本失灵线上部署项目结构模版配置文件生效 一般产品研发过程所使用的环境可分为&#xff1a; 研发环境-dev测试环境-test生产环境-prod 软件开发中&#xff0c;完整测试环境包括&#xff1a;UT、IT、ST、UAT UT Unit Test 单元测试 IT System Integration …...

制作公司网站要多少费用呢/seo技术培训教程视频

2017年7月7日至9日全球人工智能与机器人峰会— CCF-GAIR大会&#xff0c;在深圳开幕。在9日下午&#xff0c;虽然CCF-GAIR大会已经进行到最后一天了&#xff0c;但各个分会场依然是人员爆满&#xff0c;而在CV&#xff0b;专场同样在备受瞩目中拉开帷幕。微软亚洲研究院资深研究…...

网站建设流程中哪些部分比较重要/推广接单平台哪个好

RabbitMQ在Erlang node&#xff08;节点&#xff09;上 Erlang天生具有集群特性&#xff0c;非常好搭建集群&#xff0c;每一个节点&#xff08;node&#xff09;上具有一个叫erlang.Cookie的东西&#xff0c;也是一个标识符&#xff0c;可以互认。 1&#xff09;、n台Linux的防…...

网站跳转qq链接怎么做的/怎么推广

Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧&#xff08;转载&#xff09; Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义…...

网站上动画视频怎么做的/北京百度seo点击器

本文内容 引入IHttpModule 概述创建自定义 HTTP 模块的步骤演示创建自定义 HTTP 模块 HTTP 模块的工作方式 HTTP 模块与 Global.asax 文件参考资料引入 本文在 VS 2008 和 IIS 6 环境下概述如何利用 IHttpModule 自定义 HTTP 模块。 当我们在 VS 2008 里新建一个 Web 应…...

网站ico添加/跟我学seo

JDK环境变量的配置 新建->变量名"JAVA_HOME"&#xff0c;变量值"C:\Program Files\Java\jdk1.8.0_291"&#xff08;即JDK的安装路径&#xff09; 编辑->变量名"Path"&#xff0c;点击"新建"&#xff0c;然后输入上"%JAVA…...

手机如何创建网站/优化系统软件

sudo yum install expect#!/usr/bin/expect set timeout 3 spawn ssh root192.168.234.249 expect "*password*" send "123456\r" send "sudo -s\r" send "cd /data/logs\r" interact...