所以我们的课程有a
和b
。线程one
调用a
,其他任何线程都无法调用a
或b
,直到one
会调用b
。含义线程one
能够调用a
而不是a
和...而不是a
,而one
没有调用b
其他想要调用a
或b
的线程等待。是否可以使用boost::mutex
进行此类操作以及如何进行此操作?
答案 0 :(得分:6)
互斥锁不是问题;这是锁。最简单的解决方案是
只需手动拨打mutex::lock()
和mutex::unlock()
,然后忘了
关于mutex::scoped_lock
;毕竟,你不想要锁定
尊重范围。问题是通常的问题;你可能
想要在异常的情况下释放锁。一种解决方案是
动态分配mutex::scoped_lock
,并使用std::auto_ptr
或boost::shared_ptr
来管理它。 (奇怪的是,两者都没有
boost::mutex::scoped_lock
也std::lock_guard
是可移动的,所以你
需要动态分配才能转让所有权。)
答案 1 :(得分:3)
它具有单独的lock()
和unlock()
功能。让互斥体成为你的类的成员,然后调用这些相应的函数......我会找到另一种方法 - 你可能有各种奇怪的情况(比如线程调用a
崩溃?)
答案 2 :(得分:2)
有几种方法可以做到这一点。您可以将互斥锁作为基类的属性,然后从中继承工作对象。或者将互斥锁的引用发送给每个工人类。
答案 3 :(得分:1)
有可能。只需从boost::mutex::lock()
拨打a
,从boost::mutex::unlock()
拨打b
。
但请注意,如果在互斥锁被锁定时抛出异常,则应确保最终调用unlock
。 scoped_lock
会自动执行此操作,但您必须手动执行此操作。