参考博客:http://www.cnblogs.com/kennyMc/archive/2012/12/15/2818887.html 互斥量进行线程同步,与关键段和事件的区别
参考博客:http://www.cnblogs.com/xilentz/archive/2012/11/13/2767317.html 四种进程或线程同步互斥的控制方法
线程同步解决多线程并发问题;
几种内核对象中,除了互斥量,没有任何一个会记住自己是哪个线程等待成功的。
互斥量和关键段的比较:
(1)关键段只适用于同一个进程,互斥量可适用与不同的进程
(2)关键段的效率更高
(3)关键段不安全,而互斥量更安全;
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
/************** 线程同步--互斥方式******************/
1、原子访问---变量为Volatile关键字修饰,避免编译器优化,始终从变量在内存中的位置读取变量的值。
原子访问:指线程在访问某一个资源的同时保证没有其他线程会在同一时刻访问同一资源。
即:需要保证递增或者递减操作是原子操作(不可被中断的一个或一系列操作),不会被打断.
处理器自动保证基本的内存操作的原子性---当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。复杂的内存操作处理器不能自动保证其原子性,处理器提供总线锁定和缓存锁定两个机制保证内存操作的原子性.
X86系列CPU,Interlocked 函数会在总线上维持一个硬件信号LOCK#,这个信号会组织其他CPU访问同一个内存地址; 所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效,
Interlocked 函数执行得极快,不需要在用户模式和内核模式之间进行切换,