Win32多线程之最小锁定时间

来源:互联网 发布:安卓虚拟网络 编辑:程序博客网 时间:2024/04/29 16:14

在任何关于同步机制的讨论中,不论是在Win32或Unix或其他操作系统,你一定会一再地听到这样一条规则:

 不要长时间锁住一份资源


   如果你一直让资源被锁定,你就会阻止其他线程的执行,并把整个程序带到一个完全停止的状态。以critical sectin 来说,当某个线程进入critical section时,该项资源即被锁定。

   我们很难定义所谓”长时间“是多少,如果你在网络上进行操作,并且是在一个拨号网络上,长时间可能是指数分钟,如果你所处理的是应用程序的一项关键性资源,长时间可能是指数个毫秒。

   我能够给你的最牢靠而立即的警告就是,千万不要在一个critical section中调用Sleep()或任何Wait...() API函数。

   当你以一个同步机制保护一份资源时,有一点必须常记在心,那就是:这项资源被使用的频率如何?线程必须多快释放这份资源,才能够确保整个程序的运作很平顺?

   某些人会关心这样的问题:如果我再也不释放资源(或不离开critical section,或者不释放mutex......等等),会怎样?答案是:不会怎样!

   操作系统不会当掉,用户不会获得任何错误信息,最坏的情况是,当主线程(一个GUI线程)需要使用这被锁定的资源时,程序会挂在那儿,动也不动。

   Critical section的一个缺点就是,没有办法获知进入critical section中的那个线程是生是死。从另一个角度看,由于critical section不是核心对象,如果进入critical section的那个线程结束了或者当掉了,而没有调用LeaveCriticalSection()的话,系统没有办法将该critical section清除。如果你需要那样的机能,你应该使用mutex(后面讲介绍mutex)。

原创粉丝点击