《Win32多线程程序设计》读书笔记(二)(同步机制)
2013-09-08 22:36
267 查看
1,任何时候当一段代码需要两个或更多的资源时,都有潜在性的死锁阴影。死锁的情况非常复杂。例如下面一段代码
假设线程A的SwapLists()的第一次EnterCriticalSection()之后,发生了contex switch(也就是调度程序选换了一个线程),然后线程B执行了它的SwapLists()操作,这时就会出现死锁。
2,criticalsection 和 mutex区别
2.1,criticalsection是进程的一段内存空间,而mutext一个核心对象
2.2,锁住一个未被拥有的mutex,比锁住一个未被拥有的criticalsection,需要花费几乎100倍的时间。因为criticalsection不需要进入操作系统核心,直接在“usermode”就可以操作。
2.3,Mutexes可以跨进程使用。criticalsection则只能在同一个进程中使用。
2.4,等待一个mutex时,你可以指定“结束等待”的时间长度。但对于criticalsection则不行
以下是两种对象的相关函数比较:
![](https://img-blog.csdn.net/20130908223812609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130908223916875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130908230354375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130908230303281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130908230524421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130908230431156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3,信号量(Semaphore)
![](https://img-blog.csdn.net/20130909231217031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20130909231326437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4,事件(Event)
![](https://img-blog.csdn.net/20131009145240640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5,同步机制摘要
![](https://img-blog.csdn.net/20131009145250750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFzc2lvbl93dTEyOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
void SwapLists(list* list1, list* list2) { list *tmp; EnterCriticalSection(list1->cs); EnterCriticalSection(list2->cs); tmp->head = list1->head; list1->head = list2->head; list2->head = tmp->head; LeaveCriticalSection(list1->cs); LeaveCriticalSection(list2->cs); }
假设线程A的SwapLists()的第一次EnterCriticalSection()之后,发生了contex switch(也就是调度程序选换了一个线程),然后线程B执行了它的SwapLists()操作,这时就会出现死锁。
2,criticalsection 和 mutex区别
2.1,criticalsection是进程的一段内存空间,而mutext一个核心对象
2.2,锁住一个未被拥有的mutex,比锁住一个未被拥有的criticalsection,需要花费几乎100倍的时间。因为criticalsection不需要进入操作系统核心,直接在“usermode”就可以操作。
2.3,Mutexes可以跨进程使用。criticalsection则只能在同一个进程中使用。
2.4,等待一个mutex时,你可以指定“结束等待”的时间长度。但对于criticalsection则不行
以下是两种对象的相关函数比较:
3,信号量(Semaphore)
4,事件(Event)
5,同步机制摘要
相关文章推荐
- 副本机制与副本同步------《Designing Data-Intensive Applications》读书笔记6
- 《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记
- 读书笔记:Java并发实战第15章 原子变量与非阻塞同步机制
- 学习笔记 -- Win32多线程程序设计(三) 同步机制 Critical section and Mutex
- 《Win32多线程程序设计》(9)---同步机制摘要
- 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记
- 《Win32多线程程序设计》学习笔记 第4章 同步控制之Mutex互斥器
- java同步机制
- 深入理解JavaScript编程中的同步与异步机制
- Unreal中的网络同步机制
- 解析Linux内核的同步与互斥机制(五)
- java基础复习之二:Java实现同步机制是(生产消费者)
- 同步机制之--java之CountDownLatch闭锁
- Android源码学习笔记-同步机制
- JavaScript编程中的同步与异步机制
- Java多线程的同步机制(synchronized)
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- Linux 内核的同步机制,第 2 部分
- Harbor用户机制、镜像同步和与Kubernetes的集成实践
- 读书笔记—CLR via C#同步构造28-29章节