【操作系统】同步和互斥详细讲解(算法+源码)

博主介绍:✌全网粉丝喜爱+、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦!

🍅附上相关C语言版源码讲解🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

一、同步与互斥概念

操作系统中的同步和互斥操作是指处理多个任务或进程时的不同方式。多个线程访问共享数据时,使用互斥锁可以确保在任意时刻只有一个线程能够修改数据,防止数据不一致。

同步定义: 同步是指多个任务或进程按照一定的顺序执行,以确保它们之间的关系和协调。

关键点:

  1. 协调执行: 任务按照一定的规则或条件顺序执行,以避免不确定的结果。
  2. 等待机制: 在同步环境中,一个任务的执行可能需要等待其他任务的完成或满足特定条件。

互斥定义: 互斥是指在同一时刻只允许一个任务或进程访问共享资源,以防止数据竞争和一致性问题。

关键点:

  1. 独占资源: 一次只有一个任务能够访问临界区(共享资源的代码段)。
  2. 互斥锁: 通常使用互斥锁等机制来保护共享资源,确保只有一个任务能够持有锁并访问资源。

二、算法

#include <windows.h>
#include <iostream>
#include<stdio.h>bool g_continue = true; //控制程序结束
HANDLE g_hS; //当盘子为空时的线程 
HANDLE g_hS0; //当盘子中放的是桔子线程 
HANDLE g_hS1; //当盘子中放的是苹果线程 
DWORD WINAPI father(LPVOID); //定义父亲线程
DWORD WINAPI son(LPVOID); //定义儿子线程
DWORD WINAPI daughter(LPVOID);//定义女儿线程
int main()  
{  //创建各个互斥与资源信号量  g_hS = CreateSemaphore(NULL,1,1,NULL);  //盘子中是否有水果 g_hS0 = CreateSemaphore(NULL,0,1,NULL);  //盘子中的水果为桔子 g_hS1 = CreateSemaphore(NULL,0,1,NULL);  //盘子中的水果为苹果 //其中第2和3个参数为信号量的初始值和最大值const unsigned short father_COUNT = 0; //声明父亲const unsigned short son_COUNT = 0; //声明儿子const unsigned short daughter_COUNT = 0;//声明女儿//总的线程数 const unsigned short THREADS_COUNT = father_COUNT+son_COUNT+daughter_COUNT ;  HANDLE hThreads[THREADS_COUNT]; //各线程的handle  DWORD fatherID[father_COUNT]; //父亲线程的标识符DWORD sonID[son_COUNT]; //儿子线程的标识符  DWORD daughterID[daughter_COUNT]; //女儿线程的标识符//创建父亲进程hThreads[0]=CreateThread(NULL,0,father,NULL,0,&fatherID[0]);  if (hThreads[0]==NULL) return -1;  //创建儿子进程hThreads[1]=CreateThread(NULL,0,son,NULL,0,&sonID[0]);  if (hThreads[1]==NULL) return -1;  //创建女儿进程hThreads[2]=CreateThread(NULL,0,daughter,NULL,0,&daughterID[0]);  if (hThreads[2]==NULL) return -1;  while(g_continue){  if(getchar()){ //按回车后终止程序运行  g_continue = false;  }  }  return 0;  
}  
//父亲放水果的操作,输出  void eat()  
{  std::cerr << "儿子吃桔子" << std::endl;  
}  void eat1()  
{  std::cerr << "女儿吃苹果" << std::endl;  
}  //父亲进程  
DWORD WINAPI father(LPVOID lpPara)  
{  while(g_continue){  WaitForSingleObject(g_hS,INFINITE);   int juzhi=rand()%2; //设置了一个随机数,来模拟父亲放的是什么水果 Sleep(1500);//方便观察实验结果if(juzhi==1){printf("父亲放入了一个桔子\n");Sleep(1000);ReleaseSemaphore(g_hS0,1,NULL); }else{printf("父亲放入了一个苹果\n"); Sleep(1000);ReleaseSemaphore(g_hS1,1,NULL); }}  return 0;  
}  //儿子进程 
DWORD WINAPI son(LPVOID lpPara)  
{  while(g_continue){  WaitForSingleObject(g_hS0,INFINITE); eat(); Sleep(1500); ReleaseSemaphore(g_hS,1,NULL);   }  return 0;  
}    //女儿进程 
DWORD WINAPI daughter(LPVOID lpPara)  
{  while(g_continue){  WaitForSingleObject(g_hS1,INFINITE);    eat1(); Sleep(1500); ReleaseSemaphore(g_hS,1,NULL); }  return 0;  
}    

执行结果

三、总结

同步的应用:

  1. 线程同步: 在多线程编程中,同步用于协调多个线程的执行,确保它们按照一定的顺序执行或等待某些条件满足后再继续执行。

  2. 协同任务: 同步可以用于协同任务的执行,确保任务之间的依赖关系和顺序。

  3. 异步编程: 同步机制常用于异步编程中,确保异步任务的正确执行顺序。

  4. GUI应用: 在图形用户界面(GUI)应用中,同步用于处理用户界面的响应和更新,以保持用户体验。

  5. 网络通信: 同步操作常用于等待网络数据的到达或发送数据后等待确认。

互斥的应用:

  1. 共享资源保护: 互斥机制用于保护共享资源,防止多个线程或进程同时访问导致数据不一致性或竞态条件。

  2. 临界区保护: 互斥锁用于保护临界区,确保在任意时刻只有一个线程能够执行临界区的代码。

  3. 文件操作: 互斥可以用于文件读写操作,以确保在写操作进行时不会发生读操作,反之亦然。

  4. 数据库访问: 在数据库应用中,互斥用于保护对数据库的访问,以防止并发访问导致数据不一致。

  5. 资源分配: 互斥可以用于保护对有限资源的访问,如线程池中的线程对任务的分配。

综合应用:

  1. 生产者-消费者问题: 使用同步和互斥来解决生产者和消费者之间的数据共享和协调问题。

  2. 读写锁: 读写锁结合了同步和互斥的特性,允许多个线程同时读取共享数据,但在写操作时进行互斥。

  3. 定时任务调度: 同步和互斥可以用于定时任务的调度,确保任务在指定时间执行。

  4. 并行计算: 在并行计算中,同步和互斥用于协调和保护多个计算单元的执行。

大家点赞、收藏、关注、评论啦 !

谢谢哦!如果不懂,欢迎大家下方讨论学习哦。

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

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

相关文章

记录一次从有道云笔记迁移到语雀笔记

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 1、安装git&#xff0c;python3等准备工作 文章中标注python3&#xff0c;为避免与python2 冲…

【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔

项目文件&#xff1b; 【1】 【2】 【3】 【4】 【5】 【6】 【7】 【8】

【小白学机器学习3】关于最简单的线性回归,和用最小二次法评估线性回归效果, 最速下降法求函数的最小值

目录 1 什么是回归分析 1.1 什么是线性回归 1.2非线性回归 2 数据和判断方法 2.1 原始数据 2.2 判断方法&#xff1a;最小二乘法 3 关于线性回归的实测 3.1 用直线模拟 3.2 怎么判断哪个线性模拟拟合更好呢&#xff1f; 3.2.1 判断标准 3.2.2 最小二乘法 3.2.3 高维…

【征服redis16】收官-redis缓存一致性问题解决方案

今天我们来写redis最后一篇&#xff1a;redis作为缓存时如何与数据库实现数据一致的问题。 最近看redis看得有点麻了&#xff0c;这篇就简单描述吧 目录 1.什么是缓存与数据库一致性问题 1.1 缓存一致性的概念 1.2 缓存不一致的场景 2.缓存不一致的解决思路 1.什么是缓存…

HarmonyOS 通过Web组件嵌套网络应用

我们今天来说说 在程序中嵌套一个网址地址 HarmonyOS中是通过一个简单的WEB组件来实现 网络应用就是相当于网址地址 通过链接将应用嵌入到手机当中 WEB组件需要两个参数 一个是 src 地址 要嵌套的网址 另一个是 控制器 我们可以先编写代码如下 import webview from "o…

力扣hot100 环形链表 快慢指针 计步器

Problem: 141. 环形链表 文章目录 思路&#x1f496; 快慢指针法&#x1f496; 计步器法 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 快慢指针法 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) /*** Definition for singly-linked list…

【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、curl介绍二、curl下载三、文件分析四、pro文件五、编译实践 一、curl介绍 curl&#xff08;CommandLine Uniform Resource Locator&#xff09;主要功能就是用不同的协议连接和沟通不同的服务器&#xff0c;相当封装了的socket。 libcurl支持http, https, ftp, g…

大模型实战营Day5笔记

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简…

超简单的OCR模块:cnocr

前言 毫无疑问的是&#xff0c;关于人工智能方向&#xff0c;python真的十分方便和有效。 这里呢&#xff0c;我将介绍python众多OCR模块中一个比较出色的模块&#xff1a;cnocr 模块介绍 cnocr是一个基于PyTorch的开源OCR库&#xff0c;它提供了一系列功能强大的中文OCR模型和…

小型园区组网实例

目录 拓扑需求IP规划路由配置交换机配置NAT配置ACL配置DHCP配置配置过程&#xff1a;配置结果&#xff1a; OSPF配置链路聚合配置配置过程&#xff1a; 网络测试 拓扑 需求 企业网络信息服务平台需实现功能&#xff1a;企业网站服务器、FTP服务器、DNS服务器。企业ip分配地址段…

阿里巴巴开源联邦学习框架FederatedScope

5月5日&#xff0c;阿里巴巴达摩院发布新型联邦学习框架FederatedScope&#xff0c;声称可以在不共享训练数据的情况下开发机器学习算法&#xff0c;从而保护隐私。&#xff0c;其源代码现已在Apache 2.0许可下发布在GitHub上。 介绍 该平台被描述为一个全面的联邦学习框架&a…

html 3D 倒计时爆炸特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5 Canvas 3D 倒计时爆炸特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen&q…

Ubuntu用gparted重新分配空间

ubuntu系统使用过程中安装系统时预先留的空间不够使用怎么办&#xff1f; 这么办&#xff01; 首先 使用df -h 查看当前空间使用情况 已经分配的空间重新规划 &#xff1f; 先将已分配的空间中的多余空间分离出来&#xff1b; 假设我想将挂载点/home下的一部分空间分给挂载…

BL120PM PLC网关,实现PLC协议转Modbus协议

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

在linux部署Prometheus+Grafana+Exporter监控系统性能

Prometheus、Grafana和Report组件是什么&#xff1f; Prometheus、Grafana和Exporter是常用于系统监控和指标收集的组合。 Prometheus是一种开源的系统监控和警报工具。它可以收集各种指标数据&#xff0c;并提供强大的查询语言和灵活的警报规则&#xff0c;用于实时监控系统…

Prometheus配置Grafana监控大屏(Docker)

拉取镜像 docker pull grafana/grafana挂载目录 mkdir /data/prometheus/grafana -p chmod 777 /data/prometheus/grafana临时启动 docker run -d -p 3000:3000 --name grafana grafana/grafana从容器拷贝配置文件至对应目录 docker exec -it grafana cat /etc/grafana/gra…

Linux之安装配置CentOS7+换源

目录 一. 安装CentOS7 二. 配置CentOS7 三. 查看、设置IP地址 3.1 查看IP地址 3.2 设置IP地址 四. 使用Xshell连接Linux客户端 4.1 Xshell的下载 4.2 Xshell的使用 五. 换软件源 一. 安装CentOS7 博主是在虚拟机中进行安装的&#xff0c;大家也可以在虚拟机中跟着尝试一…

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘int‘.

文章目录 引言报错分析解决方案1&#xff1a;降低NumPy版本解决方案2&#xff1a;更改NumPy源码 结尾 引言 在Python编程中&#xff0c;NumPy是一个不可或缺的库&#xff0c;尤其在处理大规模数值计算时。但即使是这个强大的工具&#xff0c;也可能在使用过程中遇到问题。其中…

ZigBee学习(一)

文章目录 一、ZigBee介绍二、IEEE 802.15.42.1 物理层2.2 MAC层2.3 如何实现网络和设备寻址2.4 能量管理 三、ZigBee网络拓扑结构四、ZigBee配置参数 一、ZigBee介绍 ZigBee是一种基于IEEE 802.15.4标准的高级通信协议&#xff0c;它被设计用于低速率、低功耗和短距离无线通信&…

《移动通信原理与应用》——QPSK调制解调仿真

目录 一、QPSK调制与解调流程图&#xff1a; 二、仿真运行结果&#xff1a; 三、MATLAB仿真代码&#xff1a; 一、QPSK调制与解调流程图&#xff1a; QPSK调制流程图&#xff1a; QPSK解调流程图&#xff1a; 二、仿真运行结果&#xff1a; 1、Figure1:为发送端比特流情…