当前位置: 首页 > news >正文

线程同步的四种方式

原文链接:https://blog.csdn.net/qq_40261882/article/details/100538711

1、临界区: 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。它并不是核心对象,不是属于操作系统维护的,而是属于进程维护的。

总结下关键段:
1)关键段共初始化化、销毁、进入和离开关键区域四个函数。
2)关键段可以解决线程的互斥问题,但因为具有“线程所有权”,所以无法解决同步问题。
3)推荐关键段与旋转锁配合使用。

2、互斥对象: 互斥对象和临界区很像,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程同时访问。当前拥有互斥对象的线程处理完任务后必须将线程交出,以便其他线程访问该资源。

总结下互斥量Mutex:
1)互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。
2)互斥量能够用于多个进程之间线程互斥问题,并且能完美的解决某进程意外终止所造成的“遗弃”问题。

3、信号量: 信号量也是内核对象。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最 大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1 ,只要当前可用资源计数是大于0 的,就可以发出信号量信号。但是当前可用计数减小 到0 时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离 开的同时通过ReleaseSemaphore ()函数将当前可用资源计数加1 。在任何时候当前可用资源计数决不可能大于最大资源计数。

4、事件对象: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作

总结下事件Event
1)事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。
2)事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。
3)事件可以解决线程间同步问题,因此也能解决互斥问题。

相关文章:

  • 2015年小结
  • [<死锁专题>]
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 你知道那些常用的设计模式?
  • 百度地图2.0瓦片地址获取(窗口内瓦片)
  • 设计模式的六大原则?
  • 小知识点
  • 如何做“足够好”的软件
  • 如何理解设计模式的六大原则?
  • 设计模式的分类
  • 盲并遗忘着-利用应用交付透析大型网站日志
  • 请手写一下单例模式?
  • ArrayList
  • python 遗传算法精简版
  • B-树和B+树区别
  • EventListener原理
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • ng6--错误信息小结(持续更新)
  • vue--为什么data属性必须是一个函数
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • vue总结
  • 编写符合Python风格的对象
  • 复习Javascript专题(四):js中的深浅拷贝
  • 和 || 运算
  • 浏览器缓存机制分析
  • 每天一个设计模式之命令模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 小李飞刀:SQL题目刷起来!
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​linux启动进程的方式
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #图像处理
  • (07)Hive——窗口函数详解
  • (1)虚拟机的安装与使用,linux系统安装
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (第二周)效能测试
  • (离散数学)逻辑连接词
  • (四)Controller接口控制器详解(三)
  • (四)linux文件内容查看
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)Travel Information Center
  • (学习日记)2024.01.19
  • (转) Face-Resources
  • (转)C#调用WebService 基础
  • ***检测工具之RKHunter AIDE
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net mvc总结
  • .net MySql
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net中ListT 泛型转成DataTable、DataSet
  • /boot 内存空间不够
  • /etc/shadow字段详解
  • @RequestMapping-占位符映射