windows与linux线程同步对比
来源:互联网 发布:拍照漫画软件 编辑:程序博客网 时间:2024/06/04 08:16
1.1 Windows线程同步
1.1.1 关键代码区Critical Section
所谓“关键代码区”,相信大家看名字也能理解个大概了。首先:它很关键,第二:它是代码区。之所以关键,当然目的就是每次只能一个线程能够进入;既然是代码区,那就是只能在一组拥有同样代码的线程中用。
那什么情况下会用到关键代码区呢?当然是要保护多个线程都会用到的东西了,说到这里,想必你已经猜到了:全局变量和静态变量。
1.1.2 互斥Mutex
互斥看起来和关键代码区是一样的,都是每次都是只允许一个线程使用。但互斥和关键代码区相比,具有如下特点:
对比点
关键代码区
互斥
备注
名字
无名字
有名字
NA
跨进程
不能跨进程
可以跨进程
因为有名字,所以可以跨进程
访问模式
没有超时
可以超时
NA
死锁问题
线程挂了其它线程就只能傻等了
线程挂了,操作系统会通知其它线程
NA
运行环境
用户区
内核区
所以关键代码区性能要高一些。
1.1.3 信号量Semaphore
信号量本质上就是一个计数器,当计数器大于0时就意味着被保护的对象可用。每次申请计数器就减1,释放就加1.
信号量和互斥体相比,一个最明显的差别就在于互斥体每次只能有一个线程进行访问,而信号量可以有多个线程进行访问。
看到这里,大家可能都像我开始一样存在这样的问题:如果将信号量最大值设置为1,那么不就是相当于互斥量了吗?
看起来是一样的,而且在有些系统上也确实是这样的,据说是互斥体底层就是信号量来实现的,或者干脆就没有互斥体(例如传统UNIX),但在有的系统上还是有差别的,差别在于:申请和释放是否要同一个线程完成,Windows就是这种形式。互斥体要求同一线程来申请和释放,而信号量就可以由不同的线程申请和释放(但是我很难想象这样做有什么好处,难倒要给一个线程集中获取信号量,再来通知另外的线程工作?)。
1.1.4 事件Event
事件本质上是一个系统信号,即:发生了某件事情后,发一个信号给其它关心这件事情的线程。
从事件的本质上来看,事件不是为了资源保护的,而是为了线程间通知用的。举个简单的例子:Socket接收完一个消息后,将其放入队列,然后需要通知消息处理线程进行处理。
大家想想,如果没有事件通知会怎么样呢?那接收线程只能设一个定时器或者循环,定时甚至循环去查询队列中是否有消息,这种定时和循环处理是对系统性能的极大浪费,所以,有了事件后,就不用这么浪费了。
1.2 Linux线程同步
介绍完Windows,Linux介绍就很方便了,就像上一篇博文提到的一样,Windows和Linux其实很多地方相似,线程同步也不例外。
1.2.1 关键代码区???
不好意思,Linux没有这个东东。
1.2.2 互斥Mutex
Linux和Windows是一样的,这里就不详细介绍了,需要注意的是传统UNIX并没有互斥这个东东,传统UNIX的互斥是通过二元信号量(即最大值为1)来实现的。
1.2.3 信号量Semaphore
需要注意的是Linux中信号量有两种:一种是内核POSIX标准的信号量,一种是用户态的传统UNIX IPC信号量。两者的差别如下:
对比点
POSIX Semaphore
IPC Semaphore
备注
控制者
内核
用户
IPC Semaphore可以通过semctrl函数修改对外表现。
权限控制
不允许修改
用户可修改
NA
性能
优于IPC
劣于POSIX
NA
范围
进程级
系统级
如果进程退出时忘记关闭,POSIX会自动释放。
POSIX信号量和Windows的信号量是一样的。
1.2.4 条件变量Conditions
看到这个名字有点莫名其妙,条件变量和线程同步有什么关系呢?
但其实是Linux(或者是POSIX)的名字取得不好才导致我们很难理解,本质上条件变量就是Windows的事件,作用也是一样的。唉,如果Linux或者POSIX不想和Windows同名,改成叫“通知”也能让我们这些小虾多省点脑力啊:)
- windows与linux线程同步对比
- 多线程同步与单线程异步对比
- 多线程同步与单线程异步对比
- windows 和linux 同步api对比
- windows 和linux 同步api对比
- Linux线程同步机制的几种方法总结与对比
- Linux与windows的对比
- Linux与Windows多线程对比
- 对比:Linux和Windows系统线程间
- windows和linux的线程同步性能
- java类ThreadLocal与线程同步机制的对比
- linux创建线程和windows创建线程对比
- Windows线程的同步与互斥
- windows线程与内核对象的同步
- Linux与Windows之全面对比
- Linux 与 windows 常用命令行对比
- linux 与 windows 编译 生成文件对比
- Linux目录结构与Windows对比
- 最详细bitbucket入门手册,手把手操作指南
- 【论文笔记】One Millisecond Face Alignment with an Ensemble of Regression Trees
- 网络构成
- dataTable
- 学累了可以看漫威电影啊
- windows与linux线程同步对比
- 安卓USB挂载设备监听
- 人脸关键点标识参考
- android logcat命令
- myeclipse 10 破解
- 人脸集数据库
- arcgis api for javascript 离线部署后,加载高德地图 本地加载测试已成功
- ubuntu下构建jenkins- maven - git 持续集成项目管理
- python进程间同步