Определение функции друга и альтернативная функция повышения std :: lock - PullRequest
1 голос
/ 19 декабря 2011
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;
}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2012

Может быть немного поздно, но в boost есть те же самые функции (стандартные, вероятно, идут оттуда). Хотя они не вариадны, но все же.

Вы можете найти их здесь .

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); 
0 голосов
/ 19 декабря 2011
boost::mutex m;
boost::lock(m); //or unlock
m.lock(); //or unlock again
boost::lock_guard<boost::mutex> lock(m);

должен быть синтаксисом повышения. Как я знаю, boost :: mutex и std :: mutex почти одинаковы по написанию:)

...