一、进程和线程的对比

线程进程
定义轻量级的进程。是进程中的执行单元,作为CPU调度的基本单位进程时程序的一次执行过程,作为CPU的资源分配的基本单位
优势
  • 创建以及切换速度块-----效率高
  • 线程(线程共享了进程的资源)间共享资源方便
创建多个子进程,进程之间空间相互独立---进程的稳定性、可靠性、安全性高
缺点
  • 线程间容易产生资源竞争------数据操作可能不是预期效果
  • 线程的可靠性、稳定性,不如进程
进程间,共享数据不方便

二、解决线程资源竞争问题 --- 线程互斥

1.名词解释

  • 临界资源----共享资源
  • 临界区----:一段代码区域(访问临界资源的那段代码)
  • 原子操作----要么不操作,如果要操作,一定是一次性完成的操作,不可被打断;
  • 互斥----在多线程中对临界资源的排他性访问
  • 互斥机制===》互斥锁===》保证临界资源团的访问控制;

        为了保证临界资源(共享资源)的完整操作,增加了锁的机制,即同时满足互斥访问(线程1访问,线程2不可被访问),+原子性操作(访问的整个过程必须完整,不可被打断)。

2.框架:

定义互斥锁 ===》 齿梳化锁 ===》 加锁 ===》 解锁 ===》 销毁

⭐⭐⭐⭐                                                         ⭐⭐⭐    ⭐⭐⭐

3.函数

pthread_mutex_t   +锁命名              【在全局变量中定义】

pthread_mutex_t   +锁命名 +PTHREAD_MUTEX_INITIALIZER                【静态初始化】

pthread_mutex_init();                        【在mian函数定义】【动态初始化】

(1)功能:将已经定义好的互斥锁初始化

(2)参数:

        mutex:要初始化的互斥锁

        atrr:初始化的值,一般默认 NULL;

(3)返回值:

                成功返回0;

                失败返回非0;

pthread_mutex_lock();                             【加锁】

(1)用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分代码属于原子操作;在加锁期间其他进程/线程都不可以操作该部分代码;如果函数在执行的时候,metex以及被其他部分,使用则代码阻塞;

(2)参数:mutex 用来给代码枷锁的互斥锁

(3)返回值

                成功返回0;

                失败返回非零;

pthread_mutex_uhlock();                         【解锁】

(1)功能:将指定的互斥锁解锁,解锁之后代码不在排他访问,一般枷锁解锁成对出现。

(2)参数:用来解锁的互斥锁;

(3)返回值:

                成功返回0;

                失败返回非零

pthread_mutex_d();                                【销毁锁】

(1)功能:销毁互斥锁;

(2)参数:用来销毁的互斥锁;

(3)返回值:

                成功返回0;

                失败返回非零;

代码示例

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int cnt =0;
pthread_mutex_t mutex;void *cn1(void *arg)
{ for(int i =0;i<500000;++i){pthread_mutex_lock(&mutex);int tmp = cnt;tmp = tmp+1;cnt = tmp;pthread_mutex_unlock(&mutex);printf("%d\n",cnt);}pthread_exit(NULL);return NULL;
}
void *cn2(void *arg)
{for(int i =0;i<500000;++i){pthread_mutex_lock(&mutex);int tmp = cnt;tmp = tmp+1;cnt = tmp;pthread_mutex_unlock(&mutex);printf("%d\n",cnt);} pthread_exit(NULL);return NULL;
}
int	main(int argc, char **argv)
{pthread_t tid1,tid2;pthread_mutex_init(&mutex, NULL);pthread_create(&tid1, NULL, cn1, NULL);pthread_create(&tid2, NULL, cn2,NULL);pthread_join(tid1, NULL);printf("-------------%d\n",cnt);pthread_mutex_destroy(&mutex);pthread_join(tid2, NULL);return 0;
}

总结:

  • 锁的目的,保证临界资源的互斥以及原子性访问

三、线程间协作-----线程同步

  • 互斥 ===》 在多线程中临界资源的排他性访问
  • 同步 ===》 有一定先后顺序的,对资源的排他性访问。-------有顺序的访问

1.信号量背景:交通信号灯

(1)信号量的机制:

  •         站在a的角度考虑:这块资源什么时候能用
  •         站在b的角度考虑:这块资源什么时候能用

2.信号量分类

  • 信号无名量 ===》 线程间通信
  • 有名信号量 ===》 进程间通信

3.框架

信号量的定义   sem_t   sem;
信号量的初始化  sem_init()
信号量的P操作(申请资源)、V操作(释放资源) sem_wait()/sem_podt();
信号量的销毁sem_destroy()

四、线程同步函数

1、semapthore   信号量的定义   

     sem_t               sem

  信号量类型    信号量的变量

2、信号量的初始化

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

(1)功能:将已经定义好的信号量赋值。

(2)参数:

  • sem:要初始化的信号量
  • pthread   =0  :表示线程间使用信号量;

                    !=0:表示进程间使用的信号量

  • value:信号量的初始值,一般无名信号量-------代表一类资源的个数;

(3)返回值:

                成功返回0;

                失败返回-1;

3.P操作、V操作 

P操作------申请资源

(if(是否有资源可用)

                   有;则程序往下使用资源

                  无;程序阻塞,等待资源可用

V操作 ------ 释放资源

                if(是否有仍无需要资源)

                  有:释放资源给对应的任务用;

                  无:让资源个数加一,表示可用的资源数量多了一个,即新产生了一个资源;

int sem_wait(sem_t *sem); 【 P操作】

(1)功能:判断当前sem信号量是否有资源可用;如果sem有资源(==1),则申请资源。程序继续云顶;如果sem没有资源(==0),则线程阻塞等待,一旦有资源,组自动盛情资源并继续运行;

注意:sem申请资源后回自动执行,sem = sem -1;

(2)参数:sem要判断信号量的资源

(3)返回值:

                 成功返回0;

                失败返回-1;

int sem_post(sem_t *sem); 【V操作】

(1)功能 : 函数可以将指定的sem信号量资源释放,并默认执行,sem = sem+1; 线程在该函数上不会阻塞。

(2)参数:sem要释放资源的信号量;

(3)返回值

                 成功返回0;

                失败返回-1;

4.信号量的销毁

 int sem_destroy(sem_t *sem);

 (1)功能:使用完毕将指定的信号量销毁
(2)参数:sem要销毁的信号量
(3)返回值:

                 成功返回0;

                 失败返回-1;

信号的操作:-----主要用来实现线程间的顺序       

示例代码

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>#include <semaphore.h>
sem_t sem_r;
sem_t sem_w;
char buf[1024] = {0};
void *sh1(void *arg)
{while(1){sem_wait(&sem_w);fgets(buf, sizeof(buf),stdin);sem_post(&sem_r);}
}
void *sh2(void *arg)
{while(1){sem_wait(&sem_r);printf("buf = %s",buf);sem_post(&sem_w);}
}
int	main(int argc, char **argv)
{pthread_t tid1,tid2;sem_init(&sem_w, 0, 1);sem_init(&sem_r, 0, 0);pthread_create(&tid1, NULL, sh1, NULL);pthread_create(&tid2, NULL, sh2, NULL);pthread_join(tid1, NULL);pthread_join(tid1, NULL);return 0;
}

五.应用

1.什么时候用

  • 锁 ----有多线程,公共资源,互斥访问
  • 信号量-----多线程,公共资源,顺序访问

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

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

相关文章

洛谷 P1395 会议

【题目链接】 洛谷 P1395 会议 【题目考点】 1. 树形动规&#xff1a;树的重心 本题为求树的重心模板题 【解题思路】 树的重心&#xff1a;相比于树中其它结点&#xff0c;其所有的子树中结点数最多的子树的结点数最少&#xff0c;该结点就是这棵树的重心。 另一种定义&…

Microsoft 365 Adoption Score功能深度解析:驱动企业数字化转型的利器

在数字化转型的浪潮中,Microsoft 365(原Office 365)凭借其强大的生产力工具和云服务生态,已成为全球企业和组织提升效率、协作和创新的核心平台。然而,仅仅部署Microsoft 365并不足以充分发挥其潜力,关键在于如何推动员工高效采用这些工具,并将其融入日常工作流程。为此…

尺寸标注识别5 实例分割 roboflow | result.boxes获取边界框 | yolov8n-seg架构 torchinfo | 对直线关系不敏感

https://gitee.com/njsgcs/yolo-local 单标注一个尺寸线 100轮就百分百了 Sign in to Roboflow 有混起来的问题 roboflow训练用的cocon-seg模型我网上找不到 上面这种比较麻烦 text的中心要在dt范围内 屏幕点以下等同于按下save&#xff08;enter&#xff09; 取最长线段作…

敏捷开发卡在需求分析?飞算 JavaAI 加速需求确认与功能迭代

在敏捷开发中&#xff0c;需求分析常成为团队推进的 “卡点”—— 模糊的需求描述、反复的需求变更、拆解落地难等问题&#xff0c;往往导致迭代周期延长。而飞算 JavaAI 作为专为 Java 开发设计的工具&#xff0c;正通过 “需求理解 - 接口设计 - 代码生成” 的全流程智能化&a…

QT跨平台应用程序开发框架(10)—— Qt窗口

目录 一&#xff0c;关于窗口 二&#xff0c;菜单栏 2.1 菜单介绍 2.2 添加菜单 2.3 添加快捷键 2.4 添加其子菜单 2.5 添加分割线和图标 三&#xff0c;工具栏 3.1 添加和使用工具栏 3.2 设置位置属性 四&#xff0c;状态栏 五&#xff0c;浮动窗口 六&#xff0c;对话框 6.1 …

git从本地仓库添加到远程仓库

先创建&#xff0c;然后配置 Git 的全局用户名和邮箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看设置的用户名和邮箱如何生成SSH公钥&#xff1f;ssh-keygen 生成sshkeyls ~…

锁步核,为什么叫锁步核?

“锁步核”&#xff08;Lockstep Cores&#xff09;这一名称源于其工作原理与军事队列行进中的“锁步”&#xff08;Lockstep&#xff09;动作的类比。以下是详细的说明整理&#xff1a;1. 军事起源&#xff1a;什么是“锁步”&#xff1f; 在传统军事训练中&#xff0c;“锁步…

python学智能算法(二十二)|SVM-点与超平面的距离

引言 前序学习进程中&#xff0c;了解了向量、向量点积运算、超平面、感知机等知识点。 SVM算法最核心的目标是通过规划租号的分割超平面&#xff0c;来使得超平面附近的点到超平面的距离和达到最大值。 那点和超平面的距离如何计算&#xff0c;就是今天学习的重点。 点与超平…

参会邀请!2025世界人工智能大会合合信息技术交流日报名启动!

2025世界人工智能大会即将开幕&#xff0c;合合信息邀请您一起参与KOL深度技术交流活动。本次活动不仅可以带您逛展2025世界人工智能大会&#xff0c;在合合信息展台体验AI黑科技&#xff0c;还可以与行业顶尖技术专家面对面交流&#xff0c;共同探讨当下热门AI安全话题。 详细…

零基础入门:用C++从零实现TCP Socket网络小工具

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 网络编程中的套接字&#xff08;Socket&#xff09;是通信的基本接口&#xff0c;允许不同计算机之间通过网络交换数据。套接字是计算机网络中通信的“端点”&#xff0c;通过它&#xff0c;应用程序可以与…

SOES:软实现EtherCAT从站协议栈项目介绍及从站开发案例

在现代工业自动化领域&#xff0c;EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;以其高速、实时和开放的特性&#xff0c;成为现场总线通信的主流协议之一。EtherCAT网络中&#xff0c;主站&#xff08;Master&#xff09;负责调度和管理&#…

[simdjson] 填充字符串 | `document` 对象 | on-demand 模式

第二章&#xff1a;填充字符串 在第一章解析器中&#xff0c;我们学习了simdjson::dom::parser和simdjson::ondemand::parser作为可复用内存的JSON解析工具。 本章将深入解析JSON数据输入的核心要求——“填充字符串”。 为何需要填充&#xff1f; simdjson通过SIMD&#x…

扭蛋机小程序开发:开启线上娱乐新风尚

在当今数字化浪潮席卷的时代&#xff0c;娱乐方式正经历着前所未有的变革。传统的扭蛋机&#xff0c;那充满惊喜与期待的实体装置&#xff0c;曾是无数人童年回忆中的欢乐源泉。如今&#xff0c;随着科技的飞速发展&#xff0c;扭蛋机小程序开发应运而生&#xff0c;将这份经典…

【React Native】布局和 Stack 、Slot

布局和Stack 点击链接后&#xff0c;页面切换时最好是有动画效果。页面一般都有头部&#xff0c;里面有页面的标题之类的东西。 在app目录里&#xff0c;新建一个_layout.js文件&#xff0c;这是项目的布局文件。 这个名字是固定的&#xff0c;前面必须有一个_ 。 布局的意…

3C电子产品蓝光三维扫描检测方案-中科米堆CASAIM

随着3C电子产品向轻薄化、精密化方向发展&#xff0c;传统的二维检测技术已难以满足现代制造业对产品精度的高标准要求。特别是在智能手机、平板电脑等消费电子领域&#xff0c;微小的结构偏差都可能导致产品组装困难或性能下降。当前行业内普遍面临检测效率低、数据采集不完整…

Docker 镜像原理

Union FS(联合文件系统) Union File System 是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS 是一种为 Linux&#xff0c;FreeBSD 和 NetBSD 操作系统…

为什么IoTDB成为物联网场景的技术优选?

在物联网、工业监控等领域&#xff0c;时序数据的高效管理成为技术架构设计的关键环节。时序数据库作为专门处理带时间戳数据的系统&#xff0c;其选型需兼顾性能、兼容性与场景适配性。本文将从技术角度解析 IoTDB 的设计理念与实践方法&#xff0c;为时序数据库选型提供参考。…

js中的微任务和宏任务的理解

在JavaScript中&#xff0c;微任务&#xff08;Microtask&#xff09;和宏任务&#xff08;Macrotask&#xff09;是异步任务执行机制的重要组成部分&#xff0c;它们共同构成了JavaScript事件循环&#xff08;Event Loop&#xff09;的核心逻辑。理解这两个概念对于编写高性能…

Spring-AI系列-AI模型-Model

原文-知识库&#xff0c;欢迎大家评论互动 AI Model API Portable ModelAPI across AI providers for Chat, Text to Image, Audio Transcription, Text to Speech, and Embedding models. Both synchronous and stream API options are supported. Dropping down to access mo…

MySQL查询今天、昨天、上周、近30天、去年等的数据的方法

目录 常用的MySQL查询今天、昨天、上周、近30天、去年等数据的方法 0、Sql server中DateDiff()用法 1、MySQL的DATE_SUB()函数 定义和用法 语法 实例 2、MySQL的TO_DAYS(date) 3、MySQL的DATE() 函数 定义和用法 4、MySQL NOW() 函数 定义和用法 语法 实例 例子 …