我的windows多线程系列文章:
<a href="http://www.cnblogs.com/TenosDoIt/p/3602426.html">windows多线程--原子操作</a>
<a href="http://www.cnblogs.com/TenosDoIt/p/3601458.html">windows多线程同步--事件</a>
<a href="http://www.cnblogs.com/TenosDoIt/p/3601387.html">windows多线程同步--互斥量</a>
<a href="http://www.cnblogs.com/TenosDoIt/p/3601308.html">windows多线程同步--临界区</a>
<a href="http://www.cnblogs.com/TenosDoIt/p/3601252.html">windows多线程同步--信号量</a>
<a href="http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html">windows 多线程: CreateThread、_beginthread、_beginthreadex、AfxBeginThread 的区别</a>
一 同步互斥区别
同步:同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒,即他们之间有先后关系。
线程互斥可以看成是一种特殊的线程同步
进程(线程)之间的两种关系:同步与互斥。 所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。 所谓同步,是指散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。 显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)! 总结: 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
当线程并发执行时,由于资源共享和线程协作,使用线程之间会存在以下两种制约关系。 (1).间接相互制约。一个系统中的多个线程必然要共享某种系统资源,如共享CPU,共享I/O设备,所谓间接相互制约即源于这种资源共享,打印机就是最好的例子,线程A在使用打印机时,其它线程都要等待。 (2).直接相互制约。这种制约主要是因为线程之间的合作,如有线程A将计算结果提供给线程B作进一步处理,那么线程B在线程A将数据送达之前都将处于阻塞状态。 间接相互制约可以称为互斥,直接相互制约可以称为同步,对于互斥可以这样理解,线程A和线程B互斥访问某个资源则它们之间就会产个顺序问题——要么线程A等待线程B操作完毕,要么线程B等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步。
二 同步互斥的方法
分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
用户模式下的方法有:原子操作、临界区
内核模式下的方法有:互斥量、信号量、事件
三 临界区、互斥量、信号量、事件 对比

1、关于线程所有权属性:即某个线程获得该同步工具后,在他释放该工具前可以多次进入想访问的资源,一般来说具有所有权属性的工具不用于线程同步,只用于互斥,具体可以参考本文最前面的几篇博客
2、内核模式下的工具可以用于不同进程的线程之间的同步互斥,用户模式则只能用于相同进程的线程之间
3、只有互斥量在线程异常退出时,会释放对该工具的所有权,其他线程可以继续获取。其他的工具在线程异常退出时,其占有的工具不会释放,其他线程需要一直等待
本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3602797.html,如需转载请自行联系原作者