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

这篇具有很好参考价值的文章主要介绍了【操作系统】同步和互斥详细讲解(算法+源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

🍅附上相关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;  
}    

执行结果

【操作系统】同步和互斥详细讲解(算法+源码),课程设计,算法,c++,c语言,数据结构,动态规划,线性回归

三、总结

同步的应用:

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

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

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

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

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

互斥的应用:

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

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

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

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

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

综合应用:

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

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

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

  4. 并行计算: 在并行计算中,同步和互斥用于协调和保护多个计算单元的执行。文章来源地址https://www.toymoban.com/news/detail-817127.html

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

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

到了这里,关于【操作系统】同步和互斥详细讲解(算法+源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统——进程互斥的软件实现算法(王道视频p27、课本ch6)

    1.总结概览: 2.单标志[turn]法——算法代码: 可能违反“空闲让进” 3.双标志[flag[2]]先检查法——算法代码: 如果不能利用硬件的原语的话,就可能出现违反“忙则等待”的问题: 4.双标志[flag[2]]后检查法——算法代码: 可能会出现 资源死锁(违反“空闲让进”) 5.PeterSon算

    2024年02月07日
    浏览(41)
  • 【操作系统复习之路】存储器管理(第四章 &超详细讲解)

    目录 一、存储器的层次结构 二、程序的装入和链接 2.1 逻辑地址和物理地址 2.2 绝对装入方式 2.3 可重定位装入方式 2.4 动态运行时装入方式 2.5 静态链接  2.6 装入时动态链接 2.7 运行时动态链接 三、连续分配存储器管理方式 3.1 单一连续分配 3.2 固定分区分配 3.3 动态分区

    2024年04月27日
    浏览(40)
  • 【Linux操作系统】Linux系统编程实现递归遍历目录,详细讲解opendir、readdir、closedir、snprintf、strcmp等函数的使用

    在Linux系统编程中,经常需要对目录进行遍历操作,以获取目录中的所有文件和子目录。递归遍历目录是一种常见的方法,可以通过使用C语言来实现。本篇博客将详细介绍如何使用C语言实现递归遍历目录的过程,并提供相应的代码示例,同时解释相关函数的使用。 1.1.1 函数

    2024年02月12日
    浏览(36)
  • 【Linux操作系统】多线程抢票逻辑——学习互斥量(锁)函数接口

    临界资源 : 多线程执行流共享的资源就叫做临界资源 。 临界区 :每个线程内部, 访问临界资源的代码,就叫做临界区 。 互斥 :任何时刻, 互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用 。 原子性 :不会被任何调度机制打断的操作

    2024年02月16日
    浏览(41)
  • 操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

    文章目录 优先级调度算法介绍 两种情况 调度算法分类 优先级分类 实验内容与要求 实验步骤 调度算法总流程图  优先级调度算法流程图  实验代码 实验结果         优先级调度算法既可以用于作业调度,又可以用于进程调度。该算法中的优先级用于描述作业或者进程的

    2024年02月01日
    浏览(51)
  • 操作系统实验:进程同步控制

    前言 一、开发语言及实验平台或实验环境 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 七、diy一下 总结 计算机操作系统是一门研究计算机系统的基本原理和设计方法的课程,它涉及到计算机系统的结构、功能、性能和管理等方面。操作系统实验是

    2024年02月05日
    浏览(41)
  • 【操作系统】第2章进程同步、PV操作、死锁

    (1) 临界资源 :把 一个时间段内只允许一个进程使用的资源 称为临界资源。许多物理设备(摄像头、打印机)和许多变量、数据、内存缓冲区都属于临界资源。 对临界资源的访问必须互斥地进行 。 ① 进入区 :为了进入临界区使用临界资源,在进入区检查可否进入临界区

    2024年02月03日
    浏览(222)
  • 操作系统:4、进程管理之进程同步

    上述过程,若并发执行就会出现缓冲区数据出错 “哲学家进餐问题中会发生极端情况,所有哲学家都饿死,也就是所有进程都陷入等待状态” “生产者消费者问题”以及“哲学家进程问题”的根源问题是:彼此相互之间没有通信。 若生产者通知消费者我已经完成一件产品生

    2023年04月26日
    浏览(49)
  • Rsync 文件同步(一):系统基本操作

    Rsync (remote sync) UNIX 及类 UNIX 平台下一款数据镜像备份软件 很神奇 不同于 FTP 或其他文件传输服务进行全量备份,它可以根据数据的变化进行差异备份 可以使用它进行本地数据或远程数据的复制 可以使用 SSH 安全隧道进行加密数据传输 Rsync 服务端定义源数据,客户端仅在

    2024年02月02日
    浏览(43)
  • 操作系统层面下——进程状态讲解

           目录         一.进程的状态:运行态         1.什么是运行状态?         2.进程进入内存的详细图解:         总结:         二.进程的状态:阻塞态          1.什么是阻塞状态?         三.进程的状态:挂起态         1.什么是挂起

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包