针对Boost 互斥锁的可避免死锁的适配器。
SyncLock适配一个Boost 互斥锁(例如boost::mutex::scoped_lock),并且提供与原来的锁相同的应用编程接口 (它继承咯原来的锁)。
就像人们所预期的那样,调用 lock() 会阻塞 ,直到这个线程对那个互斥锁拥有排它性访问权限 。
在等待锁的权限的时候,当前的 Wt::WApplication 锁会 被临时释放,以 便让另一个辅助性线程获取程序锁。所以 ,你需要注意一下 ,当你获取这个锁时,其它的某个线程可能已经改变咯程序的当前状态咯 。
在这种情况下,同步锁很有用 :多个 (或者全部的) WApplication 实例运行于单个进程中并且互相通信 (例如内置的httpd)。然后 ,这个锁适配器会帮助在程序想要访问一个被互斥锁保护的共享资源的时候避免死锁情况的发生 ,它会在获取其它程序的更新锁的时候与它们通信 。在那种情况下 ,你可能会想要在保持全局互斥锁的同时在所有 “已注册”的程序中遍历 ,而这样会造成一个自然的死锁情景 ,因为你有两个互斥锁 (全局互斥锁 、程序互斥锁 )并且是以不同的顺序来获取的 :
•.程序互斥锁→全局互斥锁,这是在一个程序请求的情况下
•.全局互斥锁→程序互斥锁,这是在向程序传递事件的情况下
A 程序对lock()的调用的一种可能的结果就是A 的状态可能会被另一个线程(比如说 ,正在为程序 B 服务的线程 e.g. serving application)更新,因为它尝试着获取 A 的更新锁 。
下面的传统加锁代码:
boost::recursive_mutex::scoped_lock lock(mutex_);
可以使用同步锁这样写:
Wt::SyncLock<boost::recursive_mutex::scoped_lock> lock(mutex_);
HxLauncher: Launch Android applications by voice commands