2011-12-19 8 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をロック::>これは私が今までにフレンド関数は、クラスのスコープ内で定義された参照は初めてです。それは合法ですか?フレンド関数の定義とstdの代替ブースト機能が

質問2>std::lockの代わりの追加機能は何ですか?

私は、次の利用状況を見てきました:

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

最初の質問は既に回答済みです。 – 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にはまったく同じ機能があります。彼らはまだvariadicではありません。

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); 
関連する問題