Linux 操作系统线程2

关于线程的基础函数功能和用法请看:

Linux 操作系统&线程1-CSDN博客

目录

1、线程间通信

2、线程的同步和互斥

2.1、互斥锁

2.1.1 定义/初始化一个互斥锁

2.2.1 加锁

2.2.2  解锁

2.2.3  销毁锁

3 条件变量

3.1  创建并且初始化一个条件变量

3.1.1  动态创建

3.2  没有满足条件阻塞

3.3 满足条件解除阻塞

3.4 销毁

4、信号量

4.1 信号量初始化

4.2 获取信号量的值

4.3 消耗

4.4  释放

4.5 清理


1、线程间通信

线程间进行通信使用全局变量即可。

信号(同进程)

函数原型:

int pthread_kill(pthread_t thread, int sig);

参数:

        thread:线程ID

        sig:发送的信号

返回值:成功返回0;

2、线程的同步和互斥

2.1、互斥锁

        每一次操作资源的时候,默认去检测锁,如果锁处于加锁状态会等待锁解开,如果锁处于解锁状态,加锁使用,使用完毕后,解锁。

使用流程:

1、定义/初始化一个互斥锁:

pthread_mutex_t mutex;//定义
pthread_mutex_init();//初始化

2、竞争占用互斥锁:

pthread_mutex_lock 上锁

3、释放互斥锁资源:

 pthread_mutex_unlock //解锁

4、销毁互斥锁:

 pthread_mutex_destroy

2.1.1 定义/初始化一个互斥锁

1->  动态创建:

pthread_mutex_t mutex;

初始化函数原型:

int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr)

参数:1描述锁的变量 pthread_mutex_t mutex;

           2指定锁的类型,默认NULL表示创建快速互斥锁

返回值:

成功:0  失败:  -1

举例使用:

pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);

2->  静态创建

pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;//静态创建快速互斥锁

2.2.1 加锁

函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);-- 阻塞

参数:mutex  互斥锁

返回值:成功:0,失败:返回错误号

int pthread_mutex_trylock(pthread_mutex_t *mutex);

非阻塞版本,如果mutex参数所指定的互斥锁已经被锁定的话,调用pthread_mutex_trylock 函数不会阻塞当前线程, 而是立即返回一个值来描述互斥锁的状况。


2.2.2  解锁

函数原型:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

参数:mutex  互斥锁

返回值:成功:0;失败:返回错误号

2.2.3  销毁锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

参数:mutex  互斥锁

注意事项:

在同一个线程中,第一次上锁(lock),没有问题,然后没有解锁(unlock),再一次上锁,会发生阻塞,且会一直阻塞下午。

3 条件变量

条件变量:当一个条件没有满足会阻塞程序,满足条件后可以解除阻塞

3.1  创建并且初始化一个条件变量

3.1.1  动态创建

函数原型:

int pthread_cond_init(pthread_cond_t *restrict_cond,const pthread_condattr_t *restrict_attr);

参数:

        restrict_cond: 定义一个变量 pthread_cond_t cond

        第二个一般为 NULL

静态创建   

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//静态创建

3.2  没有满足条件阻塞

函数原型:

int pthread_cond_wait(pthread_cond_t *restrict_cond,pthread_mutex_t *restrict_mutex);

参数:

        restrict_cond: 定义一个变量 pthread_cond_t cond
        restrict_mutex: 定义并且初始化好的互斥锁变量
                pthread_mutex_t mutex

3.3 满足条件解除阻塞

函数原型:

int pthread_cond_signal(pthread_cond_t *cond)

形参:code  --  条件变量

3.4 销毁

函数原型:

int pthread_cond_destroy(pthread_cond_t *cond);

4、信号量

信号量:本质上是一个非负的整数计数器,用来控制对公共资源的访问

原理:p 操作使  sem  减一,v  操作使  sem 加一。信号量sem的值大于零时,线程具有公共资源的访问权限。

头文件:

#include <semaphore.h>

4.1 信号量初始化

函数原型:

int sem_init(sem_t *sem, int pshared, unsigned int value);

参数:

        sem: 初始化信号量
        pshared: 指定为 0
        value: 信号量初值

返回值: 成功: 0, 失败 : -1


4.2 获取信号量的值

函数原型:

int sem_getvalue(sem_t *sem, int *sval);

4.3 消耗

函数原型:

int sem_wait(sem_t *sem);

参数:
        阻塞 -- p 操作
        参数: 信号量的标识符
        返回值
                成功:0 失败 :-1

非阻塞:

int sem_trywait(sem_t *sem);--非阻塞

4.4  释放

函数原型:

int sem_post(sem_t *sem); -- v 操作


参数:信号量的标识符
返回值:成功:0 失败 :-1

4.5 清理

函数原型:

sem_destroy(sem_t *sem);


 

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

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

相关文章

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题&#xff0c;主要内容是&#xff1a;学习导入NTPClient库&#xff0c;通过这个库获取实时网络时间&#xff0c;显示在1.3寸TFT液晶屏幕上。此前三个专题&#xff0c;请选择查看以下链接。 第一专题内容&#xff0c;请参考 【N…

使用wxPython和pandas模块生成Excel文件

介绍&#xff1a; 在Python编程中&#xff0c;有时我们需要根据特定的数据生成Excel文件。本文将介绍如何使用wxPython和pandas模块来实现这个目标。我们将创建一个简单的GUI应用程序&#xff0c;允许用户选择输出文件夹和输入的Excel文件&#xff0c;并根据Excel文件中每个单…

docker jenkins 部署springboot项目

1、创建jenkins容器 1&#xff0c;首先&#xff0c;我们需要创建一个 Jenkins 数据卷&#xff0c;用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷&#xff1a; docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷&#xff1a; docker run -dit…

算法-并查集

目录 什么是并查集 并查集基础 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;初始化 &#xff08;3&#xff09;查询 &#xff08;4&#xff09;合并 &#xff08;5&#xff09;判断是否同一集合 并查集优化 路径压缩 启发式合并 并查集模板 模板 例题…

C#修改默认参数settings文件

右击项目在设置中进行修改&#xff1a; 千万不要在这里改。 如果要在自己的项目里添加这个文件&#xff0c;首先新建个文件夹&#xff0c;然后添加.setting文件&#xff0c;然后再像上面说的那样添加属性。

【TypeScript接口简介以及使用方法】

TypeScript 接口&#xff08;Interfaces&#xff09;是一种定义对象形状的方式&#xff0c;它只定义对象的类型&#xff0c;但不包含实现。接口在 TypeScript 中被用来定义对象的结构&#xff0c;以确保对象具有某些特定的属性和方法。 接口简介 定义对象形状&#xff1a;接口…

Google 开源项目风格指南

谷歌C开源项目编码规范&#xff1a;C 风格指南 - 内容目录 — Google 开源项目风格指南 (zh-google-styleguide.readthedocs.io)

4.请求体

什么是请求体(Request Body) 请求体是客户端发送到API的数据。 响应体是API发送给客户端的数据 API几乎总是必须发送一个响应体&#xff0c;但是客户端并不需要一直发送请求体 定义请求体&#xff0c;需要使用 Pydantic 模型 不能通过GET请求发送请求体发送请求体数据&…

常见的容器技术有哪些

容器技术是一种轻量级的软件封装方式&#xff0c;它将软件代码及其依赖项打包在一起&#xff0c;这样应用可以在任何支持容器的系统上无缝运行。它允许应用程序及其依赖项在一个隔离的环境中运行&#xff0c;这个环境被称为容器。容器技术有助于提高应用程序的可移植性、一致性…

深度学习之基于Tensorflow卷积神经网络智能体操健身系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人们健康意识的提高和数字化技术的快速发展&#xff0c;智能健身系统逐渐成为健身领域的新趋势。…

Redis之Linux下的安装配置

Redis之Linux下的安装配置 Redis下载 Linux下下载源码安装配置 方式一 官网下载&#xff1a;https://redis.io/download ​ 其他版本下载&#xff1a;https://download.redis.io/releases/ 方式二&#xff08;推荐&#xff09; GitHub下载&#xff1a;https://github.com/r…

景源畅信:个人抖音小店怎么开通?

在数字时代的浪潮中&#xff0c;个体创业已不再是遥不可及的梦想。特别是随着短视频平台的崛起&#xff0c;抖音不仅成为人们娱乐消遣的新宠&#xff0c;更是众多创业者眼中的“新大陆”。你是否也曾憧憬过在抖音上开一家属于自己的小店?那么&#xff0c;如何开通个人抖音小店…

面向对象编程与面向过程编程和函数式编程之间的区别

目录 1.引言 2.面向过程编程 3.面向对象编程和面向过程编程的对比 4.函数式编程 5.面向对象编程和函数式编程的对比 1.引言 面向对象编程是现在流行的编程范式(编程风格)。实际上&#xff0c;除面向对象编程以外&#xff0c;大家熟悉的编程范式还有另外两种:面向过程编程和…

java—异常

异常 什么是异常 异常的体系 编译时异常处理方式 1、选择报错的整个代码块&#xff0c;快捷键crtlaltt键&#xff0c;选择try/catch将代码围起来。 2、编译异常处理方式2 在main方法上抛出异常 自定义异常 例子&#xff1a; 自定义运行时异常 自定义编译时异常 异常…

SpringBoot优雅地定制JSON响应数据

提示&#xff1a;文章若有错误&#xff0c;欢迎评论区指正&#x1f36d; 文章目录 前言 一、如何使用JsonView这个注解&#xff1f; 二、应用场景 三、实战案例 注解方式 编程方式 总结 前言 最近在学习过程中发现了Jackson库的JsonView也可以改变JSON的输出结构&#xff0c;…

QT截图程序,可多屏幕截图

截图程序&#xff0c;支持多屏幕时跨屏幕截图。截图使用setMask达到镂空效果&#xff0c;截图后会有预览和保存功能。截图时按下Esc可退出。 mainwindow.ui mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> …

Ansible自动化运维工具 - playbook 剧本编写

一. inventory 主机清单 Inventory 支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.1 inventory 中的变量含义 Inventory 变量名 含义ansible_hostansible连接节点时的IP地址ansible_port连接对方…

2024-05-07 商业分析-如何在社会层面做一个更好的工具人-记录

摘要: 2024-05-07 商业分析-如何成为一个靠谱的工具人 如何在社会层面做一个更好的工具人 那么今天讲的这个主题呢&#xff0c;对吧&#xff1f;你们一看啊&#xff0c;就觉得这个就不应该我讲是吧啊&#xff0c;但是呢这个逻辑呢我还得跟你们讲一下啊&#xff0c;就是如何成为…

虚幻引擎笔记

虚幻引擎笔记 一、蓝图类二、创建自定义Character蓝图三、操作映射和轴映射 一、蓝图类 Actor&#xff1a;可以放置在关卡中的物体Pawn&#xff1a;相当于游戏角色&#xff0c;可以通过玩家控制器来控制角色&#xff1a;在Pawn的基础上增加了四处走动的功能。创建游戏角色时使用…

Freeswitch-mod开发

文章目录 一、Freeswitch-mod开发1.1 介绍1.2 实战1.2.1 新建一个mymod.c或者mymod.cpp1.2.2 新建一个Makefile1.2.3 编译 二、Freeswitch-mod-自定义Dialplan模块2.1 介绍2.2 实战2.2.1 改造mymod.c&#xff08;代码是完整的&#xff0c;自己做区别看一下&#xff09;2.2.2 编…