用户工具

站点工具


编程积累:windows:同步对象小结

在Windows平台下,用于对多线程(包括进程)之间的同步保护机制,基本上有这么几种:

  • Critical Section对象
  • Event对象
  • Mutex对象
  • Semaphore对象

网上已经有很多文章在介绍这些对象是怎么使用的,本文的着眼点在于总结出这些同步保护机制的一些明显的行为特征,而这些行为特征,也是我们在写程序时经常会碰到的。

以下讨论的这些行为特征,是对并发的进/线程之间的同步保护机制的一般描述,本文用Windows平台作为一个典型的例子。为了方便讨论,我把这四种同步对象,统统称为“锁”。

保护与同步

保护是指多线程环境下对共享资源的保护,而同步更多的是强调线程之间的协作,Critical Section对象其本质更多的是强调保护,而其它三个对象更多的是强调同步。

锁的等待超时

在开发并发的多进/线程程序时,为了避免死锁之类的问题,引入了“等超时”的概念,即当一个线程需要获得一个锁来执行某些代码的时候,它可以在所等待的锁上设置超时值。如果在确定的时间内无法获得该锁,它可以选择放弃执行该段代码的权利,这样可以在一定程度上避免死锁。Critical Section对象无法设置等待超时,其它三个对象可以。

线程锁与进程锁

线程锁指的是该锁在一个进程的所有线程中可见,而进程锁是指该锁可以被不同的进程访问,可用于进程间的同步与互斥,当然进程锁也可以用于同一个进程的不同线程之间的同步与互斥,进程锁的概念是大于线程锁的。Critical Section对象是线程锁,其它三个是进程锁。

Critical Section对象是用户态模式下实现线程同步的方法,而其它三个对象均是内核对象。内核对象机制的唯一不足之处在于它的速度比较慢。

锁的递归特质

所谓递归锁指的是当一个线程拥有一个同步锁时,而递归地想再次获得该锁。如果这次获得操作不会阻塞当前线程的执行,则称该锁为递归锁。递归锁主要是在“保护”的概念上提出的,而“保护”概念下的锁包括Critical Section对象和Mutex对象。这两种锁在Windows平台上都是递归锁。需要注意的是,调用线程获得几次递归锁就必须释放几次递归锁。

读写锁

读写锁允许高效的并发的访问多线程环境下的共享资源。对于一种共享资源,多个线程可以获得读锁,共享的读该共享资源。而在同一时刻,只允许一个线程拥有写锁改变该共享资源,这就是读写锁的概念。

个人认为,如果你想深入研究多线程的同步机制,ACE是一个绝佳的教材,在这里你会看到什么是Scoped Lock,读写锁如何实现等等。

评论

请输入您的评论. 可以使用维基语法:
 
编程积累/windows/同步对象小结.txt · 最后更改: 2018/09/20 20:37 由 eric