2011-12-19 20 views
1
class some_big_object; 
bool operator<(some_big_object& lhs,some_big_object& rhs); 

class X 
{ 
private: 
    some_big_object some_detail; 
    mutable std::mutex m; 
public: 
    X(some_big_object const& sd):some_detail(sd){} 
    friend bool operator<(X const& lhs, X const& rhs)     #1 
    { 
     if(&lhs == &rhs) 
      return false; 
     std::lock(lhs.m,rhs.m);          #2 
     std::lock_guard<std::mutex> lock_a(lhs.m,std::adopt_lock); 
     std::lock_guard<std::mutex> lock_b(rhs.m,std::adopt_lock); 
     return lhs.some_detail<rhs.some_detail; 
    } 
}; 

问题1>这是我第一次看到友元函数类的范围内确定。它合法吗?友元函数的定义和性病的替代升压功能::锁定

问题2>std::lock的替代助推功能是什么?

我看到了下面的用法:

boost::unique_lock<MutexType1> l1(m1); 
boost::unique_lock<MutexType2> l2(m2,boost::try_to_lock); 
if(!l2) 
{ 
    return 1; 
} 
+0

第一个问题已经回答,搜索SO。 – Xeo

回答

-1
boost::mutex m; 
boost::lock(m); //or unlock 
m.lock(); //or unlock again 
boost::lock_guard<boost::mutex> lock(m); 

应该是升压语法。 据我所知,boost :: mutex和std :: mutex在写作方面几乎相同:)

0

也许有点迟,但boost(标准的可能来自那里)有完全相同的功能。尽管它们并不是可变的,但是。

你可以找到他们here

boost::lock(lhs.m,rhs.m); 
boost::lock_guard<Mutex> lock_a(lhs.m,boost::adopt_lock); 
boost::lock_guard<Mutex> lock_b(rhs.m,boost::adopt_lock);