秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

分类: Windows多线程 Windows编程 11212人阅读 评论(27) 收藏 举报

前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇

秒杀多线程第五篇经典线程同步关键段CS

秒杀多线程第六篇经典线程同步事件Event

秒杀多线程第七篇经典线程同步互斥量Mutex

秒杀多线程第八篇经典线程同步信号量Semaphore

来详细介绍常用的线程同步互斥机制——关键段、事件、互斥量、信号量。下面对它们作个总结,帮助大家梳理各个知识点。

 

首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从《计算机操作系统》一书中选取的一些关于线程同步互斥的描述。相信先有个初步而模糊的印象再看下权威的定义,应该会记忆的特别深刻。

 

1.线程(进程)同步的主要任务

答:在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在急用临界资源时,如多个线程急用同一台打印机,会使打印结果交织在一起,难于区分。当多个线程急用共享变量,表格,链表时,可能会导致数据处理出错,因此线程同步的主要任务是使并发执行的各线程之间能够有效的共享资源和相互合作,从而使程序的执行具有可再现性。

 

2.线程(进程)之间的制约关系?

当线程并发执行时,由于资源共享和线程协作,使用线程之间会存在以下两种制约关系。

1).间接相互制约。一个系统中的多个线程必然要共享某种系统资源,如共享CPU,共享I/O设备,所谓间接相互制约即源于这种资源共享,打印机就是最好的例子,线程A在使用打印机时,其它线程都要等待。

2).直接相互制约。这种制约主要是因为线程之间的合作,如有线程A将计算结果提供给线程B作进一步处理,那么线程B在线程A将数据送达之前都将处于阻塞状态。

间接相互制约可以称为互斥,直接相互制约可以称为同步,对于互斥可以这样理解,线程A和线程B互斥访问某个资源则它们之间就会产个顺序问题——要么线程A等待线程B操作完毕,要么线程B等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步

 

3.临界资源和临界区

在一段时间内只允许一个线程访问的资源就称为临界资源或独占资源,计算机中大多数物理设备,进程中的共享变量等待都是临界资源,它们要求被互斥的访问。每个进程中访问临界资源的代码称为临界区

 

看完概念性知识,下面用几个表格来帮助大家更好的记忆运用多线程同步互斥的四个实现方法——关键段、事件、互斥量、信号量

 

关键段CS与互斥量Mutex

 

创建或初始化

销毁

进入互斥区域

离开互斥区域

关键段CS

Initialize-

CriticalSection

Delete-

CriticalSection

Enter-

CriticalSection

Leave-

CriticalSection

互斥量Mutex

CreateMutex

CloseHandle

等待系列函数如WaitForSingleObject

ReleaseMutex

关键段与互斥量都有“线程所有权”概念,可以将“线程所有权”理解成旅馆的房卡,在旅馆前台登记名字拥有房卡后是可以多次进出房间的,其它人则无法进入直到你交出房卡。每个线程必须先通过EnterCriticalSectionWaitForSingleObject来尝试获得“线程所有权”才能调用LeaveCriticalSectionReleaseMutex。否则会调用失败,这就相当于伪造房卡去办理退房手续——由于登记本上没有你的名字所以会被拒绝。

互斥量能很好的处理“遗弃”情况,因此在多进程之间可以放心的使用。

 

事件Event

 

创建

销毁

使事件触发

使事件未触发

事件Event

CreateEvent

CloseHandle

SetEvent

ResetEvent

注意事件的手动置位和自动置位要分清楚,不要混淆了

 

信号量Semaphore

 

创建

销毁

递减计数

递增计数

信号量

Semaphore

Create-

Semaphore

CloseHandle

等待系列函数如WaitForSingleObject

Release-

Semaphore

信号量在计数大于0时表示触发状态,调用WaitForSingleObject不会阻塞,等于0表示未触发状态,调用WaitForSingleObject会阻塞直到有其它线程递增了计数。

 

注意:互斥量,事件,信号量都是内核对象,可以跨进程使用(通过OpenMutexOpenEventOpenSemaphore)。不过为什么只有互斥量能解决遗弃”情况了请看秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

 

呵呵^_^,本系列一共使用了六篇文章来讲解了上面三个表格,如果读者能轻松写出这个表格并能解释下各函数的用法,那么对多线程的同步互斥问题也就有了良好的基础。

 

通过经典线程同步问题的学习,我们已经初步练好了解决多线程同步互斥的各种“招式”,下面再通过学习二个著名的实例《秒杀多线程第十篇 生产者消费者问题》和《秒杀多线程第十一篇 读者写者问题》来使我们在解决多线程同步时更加熟练。

 

 

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7538247

 

29
0
查看评论
14楼 chlele0105 2012-12-30 10:22发表 [回复] [引用] [举报]
楼主写的很好,网上很少有这么精彩的文章,感谢中~~~~
Re: MoreWindows 2012-12-31 10:26发表 [回复] [引用] [举报]
回复chlele0105:不客气,欢迎浏览其它文章。
13楼 miao6664659 2012-11-13 16:15发表 [回复] [引用] [举报]
楼主能否讲解一下遗弃问题在单进程多线程中的应用,我测试了一个发现在单进程多线程中 mutex也没有解决遗弃问题,而是直接退出了。
Re: miao6664659 2012-11-13 16:25发表 [回复] [引用] [举报]
回复miao6664659:不好意思,搞错了,在同一个进程下的多线程同样mutex也有遗弃的功能,在线程中应该使用exitThread(0)我使用了exit(0)。
Re: MoreWindows 2012-11-19 12:00发表 [回复] [引用] [举报]
回复miao6664659:呵呵,单进程多线程中不但mutex有,关键段也有。请看http://blog.csdn.net/morewindows/article/details/7442639
12楼 celiangzhe 2012-08-28 14:31发表 [回复] [引用] [举报]
写的太好了,图文并茂,有理论又有实践,真的很不错。
11楼 tdl1001 2012-06-13 15:41发表 [回复] [引用] [举报]
每个线程必须先通过EnterCriticalSection或WaitForSingleObject来尝试获得“线程所有权”才能调用LeaveCriticalSection或ReleaseMutex。

好像楼主前面专门讲CS和Mutex的例子都不是这样啊
Re: MoreWindows 2012-06-13 16:59发表 [回复] [引用] [举报]
回复tdl1001:呵呵,那些例子就是为了证明要这样的使用,不然无法达到要求。
10楼 xiaoyanilw 2012-05-24 01:30发表 [回复] [引用] [举报]
一口气看完了楼主的前九章,感觉深入浅出啊,很容易接受,明天继续看后面的,其他专栏也会多加关注。真心感谢楼主,楼主辛苦了。
Re: MoreWindows 2012-05-24 09:49发表 [回复] [引用] [举报]
回复xiaoyanilw:谢谢支持,看完后动手实验下,必定能助你在画试中顺利“秒杀”多线程试题。
9楼 c1715 2012-05-17 14:13发表 [回复] [引用] [举报]
学习了,支持楼主多写些此类的专栏!!!
Re: MoreWindows 2012-05-17 18:34发表 [回复] [引用] [举报]
回复c1715:谢谢支持,欢迎参阅我的《Windows C/C++/C# 编程》专栏。
8楼 goodhongwei 2012-05-17 11:31发表 [回复] [引用] [举报]
写的挺好,总结的挺用心,鼓励。Mutex再多写点就更好了,抄别人的---“Mutex在没有被任何线程所拥有时是有信号的,这时任何线程可以使用Wait functions去获取该对象的所有权。当Mutex被某个线程拥有后就处于没信号状态,并且只有当该线程使用ReleaseMutex释放该互斥对象时,它才能被其它线程获得。在一个线程中试图释放另个线程所拥有的Mutex是不会成功的,Mutex只能被所有者线程所释放。”
Re: MoreWindows 2012-05-17 18:33发表 [回复] [引用] [举报]
回复goodhongwei:这段话确实讲非常详细。文章中只是一个概括,如果是初学者建议仔细看下这段话。
7楼 zzz2505 2012-05-17 09:46发表 [回复] [引用] [举报]
很期望看到最后两篇
Re: MoreWindows 2012-05-17 18:33发表 [回复] [引用] [举报]
回复zzz2505:下周一发布《秒杀多线程第十篇 生产者消费者问题》
6楼 xrloyx 2012-05-15 08:47发表 [回复] [引用] [举报]
楼主好像没有介绍 互锁家族实现同步
5楼 jackxiangjiang 2012-05-14 15:21发表 [回复] [引用] [举报]
经典不容错过。。。支持楼主
Re: MoreWindows 2012-05-14 16:37发表 [回复] [引用] [举报]
回复jackxiangjiang:谢谢支持,后二篇也会在这个月内发布。
Re: jackxiangjiang 2012-05-18 11:34发表 [回复] [引用] [举报]
非常之期待回复MoreWindows:
4楼 zcy9898 2012-05-14 13:05发表 [回复] [引用] [举报]
期待第10篇:)
Re: MoreWindows 2012-05-14 16:37发表 [回复] [引用] [举报]
回复zcy9898:《秒杀多线程第十篇 生产者消费者问题》将于下周一发布,欢迎参阅。
3楼 lovebackdoor 2012-05-11 21:34发表 [回复] [引用] [举报]
真在学多线程,现在还无法全部吸收,期待楼主的后两篇,收集全了,打印出来慢慢研究。
Re: MoreWindows 2012-05-12 15:10发表 [回复] [引用] [举报]
回复lovebackdoor:等写全了,也会以电子书的形式发布,以方便大家阅读。
2楼 chence19871 2012-05-09 16:21发表 [回复] [引用] [举报]
一直关注着你哦,期待下一篇的精彩!
1楼 strongcurrent 2012-05-09 10:30发表 [回复] [引用] [举报]
LZ,期待你的经典实例2篇。先顶一个。
Re: MoreWindows 2012-05-09 11:07发表 [回复] [引用] [举报]
回复strongcurrent:谢谢支持,《秒杀多线程第十篇 生产者消费者问题》和《秒杀多线程第十一篇 读者写者问题》这二篇正在草稿中,后面将陆续会布。欢迎再来参阅。

你可能感兴趣的:(Windows编程,Windows多线程)