Linux线程基础

news2024/12/23 9:44:59

目录

一,线程函数

1、创建一个线程

2、获取自身线程ID

3、线程终止

4、取消正在执行线程

5、线程等待

6、线程分离

二,线程的使用

1,线程等待和线程分离

(1)、线程等待

(2)、线程分离

(3)、线程等待线程分离同时进行

三,互斥量接口

1、初始化互斥量

(1)、静态分配

(2)、动态分配

2、互斥量销毁

3、互斥量加锁

4、互斥量解锁

 四,线程互斥

1、发现问题

2、加锁解决


一,线程函数

1、创建一个线程

需要注意用的时候要链接线程库 -lpthread才可以.

(1)、thread:线程id

(2)、attr:设置线程属性,一般不设置传nullpr。

(3)、start_rootine:函数指针,线程跑起来执行的方法。

(4)、arg:线程方法的参数,安规范随便传,又是会传this,有非常的巧妙。

2、获取自身线程ID

3、线程终止

(1)、retval:输出线参数,不要传临时变量,将来这个会带回线程退出的退出码。

(2)、线程是不关心信号的,线程出错了那就是进程的错,线程崩掉整个进程都会崩掉。只要出错就找进程这个老大,就是进程的错,问责进程。

4、取消正在执行线程

 

字面意思,传需要的线程id

5、线程等待

(1)、线程也是需要等待的,类比进程等待,不然会有资源无法释放。

(2)、thread:线程id

(3)、retval:一个指针,指向线程的返回值,为什么是二级指针,因为线程方法函数返回值是一个void*的指针,我们要得到一个指针,就要传指针的地址,也就是二级指针。

(4)、如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED(pthread_canceled)。

6、线程分离

(1)、不关心线程的返回值,我们就可以直接线程执行的时候设置线程分离,这样就不需要进行线程等待消耗时间了,线程再执行结束的时候自动释放自己的资源。

(2)、可以别人分离,也可以自己分离。

(3)、joinable和分离是冲突的,一个线程不能既是joinable又是分离的。

二,线程的使用

1,线程等待和线程分离

(1)、线程等待

 

 

(2)、线程分离

(3)、线程等待线程分离同时进行

      不可以同时进行:线程分离的同时又线程等待,线程等待是会失败的,也就是说你以为资源没有回收,起始以及回收了。

   等待失败,并且导致进程收到信号退出了。 

 

三,互斥量接口

1、初始化互斥量

(1)、静态分配

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

静态分配的使用完了之后不需要销毁

(2)、动态分配

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict
attr);

mutex:要初始化的互斥量
attr:NULL

2、互斥量销毁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

3、互斥量加锁

int pthread_mutex_lock(pthread_mutex_t *mutex);
互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功
发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量,那么pthread_ lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁。

4、互斥量解锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);
 

 四,线程互斥

1、发现问题

      多线程访问统一个临界资源是,如果对临界资源的访问修改不是原子性质的,那么可能出问题。

一个抢票的例子:五个线程同时抢票

结果是错的,票已经没有了,还抢到了0号票、这么多人抢到了0号票,那么这个作为该给谁啊,这不就扯蛋蛋了、、完犊子啊。

 

原因就是--操作,和if判断都不是原子操作的。再次执行结果也是不一样的,每次都可能不一样。

 如何解决呢

2、加锁解决

对临界区进行加锁:

这下结果就正确了

所以以后再多线程情况下访问修改临界资源的时候一定要进行加锁保护临界资源。

 

 

 

 

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

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

相关文章

中英翻译《森林火灾的预防措施》

The Preventive Measures for Forest Fire 森林火灾的预防措施 The preventive measures for forest fires include some preemptive methods that can help reduce the risks of fires and contril their severity and spread, and thus, maintain ecological balance …

vue与es6的知识点

var let const let const 不能重复声明,局部作用域, 案例 let name "未来"; let str 我是${name}; console.log(str); 箭头函数 let add (x)>{ return x; } console.log(add(9)) v-bind 绑定标签的属性 src class a titie等等…

Qt for Android实现开机自启动

前言 最近项目需要,在Android上编写的程序,需要实现开机自启动。笔者查询了下资料,基本原理如下: 当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 an…

详解时间复杂度计算公式(附例题细致讲解过程)

这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度和空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n),空间复杂度是S(n)。for循环常常是O…

中学语文教学参考杂志社中学语文教学参考编辑部2022年第27期目录

理论学术_课题荟萃《中学语文教学参考》投稿:cn7kantougao163.com 统编教材鲁迅作品的民俗文化分析及教学应用 张家波;张晓静; 3-5 高中语文线上学习的实践与反思 张灵贵; 6-797 不同课型导学案设计建议 张桂霞; 8-997 现代化进程中的阵痛:《哦,香雪…

遇到Bug漏测,不能总想着甩锅吧

背景 漏测Bug是指产品逻辑缺陷在测试过程中没有被发现(尤其是测试环境可以重现的缺陷),上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。 漏测Bug可能造成线上故障或者资损,在对产品测试过程中,自己也难免…

Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分

前言:Pandas的数据操作中,最基本的就是操作的筛选了,但是对新学员来说的这又是一个难点,因为方法比较多,不容易记。在此总结一下pandas中的一些常用的数据筛选操作。 逻辑筛选数据:切片([ ]&am…

ubuntu 安装、配置FTP

ubuntu 安装、配置FTP 提示:ubuntu 16.0.4,不同版本操作可能稍有不同 前言 本文主要对服务器安装及配置FTP做一个记录,涉及安装、配置、创建FTP账号、以及第一次连接异常等。 提示:以下是本篇文章正文内容,下面案例可…

单载波频域均衡matlab仿真,包括卷积编码维特比译码,矩阵交织,QPSK调制解调,导频插入,MMSE-FDE频域均衡

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 频域均衡是从校正系统的频率特性出发,利用一个可调滤波器的频率的频率特性去补偿信道或系统的频率特性,使包括可调滤波器在内的基带系统的总特性接近无失真传输条件。频域…

【Spring项目中的Controller理解】

目录 1. 添加依赖 2. 关于异常 1. 添加依赖 首先,需要保障此项目中存在spring-boot-starter-web依赖项,否则,当前项目并不具备Web应用程序开发所需的依赖! 提示:spring-boot-starter-web是建立在spring-boot-starte…

基于Python的Django开发接口框架搭建

1、安装Django,如图1 命令行执行:pip install django 2、创建Django项目,如图2 django-admin startproject imooc 3、创建Django的应用项目,如图3 必须进入项目文件下执行命令: python3 manage.py startapp app …

✿✿✿JavaScript ---- 函数/js内置对象

目 录 一、函数 自调用函数如下演示: 二、JS中的内置对象 2.Number对象 3.Date 对象 补:第三方的日期工具类 moment.js 4.Math对象 5.数组对象 补:ES6中数组对象新增的方法 6.Global全局方法对象 7.RegExp(**)正则表达式对象 一、…

Word2010入门

Word简介 Microsoft Office Word 2010是微软公司的一个文字处理应用程序。 我们可以利用Word编辑文字、图文排版、建立表格、图形绘制。一直以来,Word都是最流行的文字处理应用程序。 .doc、.docx是Word软件默认存储文件类型, .docx正在逐步取代.doc。…

QT和网络调试助手之间的UDP通信

文章目录一、背景二、实现过程简述UDP协议工作原理及编程模型UDP 接收端UDP 发送端运行UDP接收端和发送端运行UDP发送端发送数据给网络调试助手一、背景 之前一篇博客实现了两个网络调试助手之间的UDP通信。 文章链接:在MacOS上实现两个网络调试助手的UDP通信测试…

西电数据库实验-学生学籍管理系统 数据库设计

西电数据库实验-学生学籍管理系统 数据库设计 文章目录西电数据库实验-学生学籍管理系统 数据库设计需求分析实体集联系集概念结构设计逻辑结构设计实体集department(id‾,name)department(\underline {id},name)department(id​,name)instructor(id‾,name,dept_id)instructor…

如何翻译英文音频?看完你就学会了

在平时的工作中,相信大家应该都会遇到一些不太熟悉的英文或者其它外文的语言,这给我们的生活带来了诸多烦恼,那遇到这种情况,我们应该怎么办呢?其实很简单,我们可以利用一些软件来将这些语言转换成中文&…

SpringCloud系列(三)Nacos 注册中心的搭建及服务发现

在 SpringCloud 系列(一)里面介绍了 Eureka 注册中心主要用来做什么,如何搭建并进行了简单的测试,但是 Eureka 有诸多不便之处,如需要配合 SpringCloud config 来实现,我们还需要再写一个 Module 进行启动等…

Python安装库教程(解决安装报错)

Python库安装以及报错解决方法 本文章以jieba库和wordcloud库的安装来演示安装以及安装过程报错的解决方法 一. 使用Pycharm安装 1. 没有创建项目(创建了直接去往第二步) 选择下一步 创建完成 2. 已经创建项目 3. 安装python库报错 如果显示这个就表示…

融云全球社交泛娱乐洞察,老资格的「游戏社交」还有哪些想象空间

一切应用都将社交化。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 融入社交能力,创造增长奇迹。激活用户在不同场景的社交需求,让各类应用焕发出了新的生命力,也让“社交X”成为出海最大的浪。 《2022 社交…

VMware ESXi 8.0 SLIC Unlocker, 集成网卡驱动和 NVMe 驱动

发布 ESXi 8.0 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:VMware ESXi 8.0 SLIC & Unlocker, 集成网卡驱动和 NVMe 驱动,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 发布 …