2012-07-07 65 views
4

我有一个需要评论的基本示例(C++)。Boost为同一个线程获得多个锁

比方说,我有一个函数PublicFunc(),另一个名为PrivateFunc()。我想仔细地同步它们。但是PrivateFunc有时也可以调用PublicFunc,以及我们从同一个线程调用它的方式。这会导致块,我想解决它。

mutable boost::mutex m; 

void PublicFunc() { 
m.lock(); 
//Here it blocks, but why? 
//What I need is to get the lock if this func was called from PrivateFunc(), so exactly from the same thread. 
//But! It should definitely block on calling PublicFunc from outside while we are for example in the 'OtherPrivateFunc'. 

//Do some stuff 

//this is not necessary 
m.unlock(); 
} 

void PrivateFunc() { 
m.lock(); 

PublicFunc(); 

OtherPrivateFunc(); 

m.unlock(); 
} 

哪个互斥锁或锁是从boost库中正确的? 谢谢!

回答

4

A mutex只能锁定一次;即使锁定互斥锁的尝试由锁定互斥锁的线程创建,任何锁定互锁锁定的调用都将被阻止。

如果您希望能够在同一个线程上多次锁定互斥锁,请使用recursive_mutex

或者,考虑重组您的代码,以便您拥有一组假设互斥锁被锁定的(私有)成员函数,并将所有其他函数委派给这些成员函数。这可以使代码更清晰并且可以更容易地验证同步是否正确。