FAQ 09:如果线程在Critical sections中停很久会怎么样?
如果一直让资源被锁定,你就会阻止其他线程的执行,并把整个程序带到一个完全停止的状态。以critical section来说,当某个线程进入critical section时,该项资源即被琐定。
我们很难定义所谓“长时间”是多长。如果你在网络上进行操作,并且是在一个拨号网络上,长时间可能是指数分钟,如果所处理的是应用程序的一项关键性资源,长时间可能是数个毫秒(milliseconds)。
我能够给你的最牢固而立即的警告是:千万不要在一个critical section之中调用sleep()或任何wait...()API函数。
当你以一个同步机制保护一个资源时,有一点必须记住,那就是:这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运行很平顺?
某些人会关心这样的问题:如果我再也不释放资源(或不离开critical section,或不释放mutex……等等),怎么样?答案是:不会怎么样!!
OS不会当掉。用户不会获得任何错误信息。最坏的情况是,当主线程(一个GUI线程)需要使用这被锁定的资源时,程序会挂在那儿,动也不动。真的,同步机制并没有什么神奇魔法。
评论