Ищем функцию (или макрос) для возврата boost :: scoped_lock - PullRequest
2 голосов
/ 21 июля 2011

Я ищу идею сокращения кода.Я использую boost::scoped_lock для блокировки boost::mutex, но я хочу сократить объем кода, который я пишу.

В настоящее время у меня есть mutex, определенный в моем классе, и поле члена с именем _sync.Когда я хочу заблокировать, я должен написать:

scoped_lock<mutex> lock(_sync);

Хитрость в том, что это блокировка с ограничением, поэтому я предполагаю, что если я напишу статическую функцию для возврата scoped_lock, то она разблокируетсякак только он выйдет из области действия статической функции:

static scoped_lock<mutex> lock(mutex& sync)
{
    return scoped_lock<mutex>(sync);
}

Такой подход позволит очень легко набрать:

public void Object::modify()
{
    lock(_sync); // <-- nice and short! ;)

    // do something to modify the object
    //..
    // the mutex is unlocked when we leave the scope of modify
}

Верно ли мое предположение?Сможет ли scoped_lock немедленно разблокироваться, когда он будет возвращен моей статической функцией?

Ответы [ 3 ]

6 голосов
/ 21 июля 2011

Не ...

когда вы набираете scoped_lock<mutex> lock(_sync), все, кто читает ваш код, знают, что происходит, и вы также узнаете, если вы посмотрите на свой код два года назад.Лень обычно является плохой мотивацией для создания реализации.Если вы не хотите навязывать использование, имейте больше, чем сотни мест, где вам нужно написать это выражение, просто не делайте этого

За то время, которое у вас ушло на написание вопроса, и количествовремя, которое вы потратили на размышления о том, как это сделать, и количество времени, которое все мы потратили на ответ на ваш вопрос, вы, вероятно, могли бы написать все scoped_lock<mutex> lock(_sync), что вам нужно.Особенно, если вы используете поддержку дополнений IDE.

4 голосов
/ 21 июля 2011
#define LOCK(a) scoped_lock<mutex> scopedLockVar(a)

public void Object::modify()
{
    LOCK(_sync); // <-- nice and short! ;)

    // do something to modify the object
    //..
    // the mutex is unlocked when we leave the scope of modify
}

Вы должны использовать безопасное имя для определения ... Компилятор просто использует поиск и замену для определений ...

3 голосов
/ 21 июля 2011

Я бы подумал, что ваша блокировка будет скомпилирована полностью.

Смысл блокировки с областью действия - это то, что она существует локально, поэтому вы должны объявить ее локально.Я не думаю, что есть способ обойти это в c ++ без макросов (который просто скрывает код где-то еще).

Я считаю, что использую typedef, тогда все знают, что вы делаете.

typedef scoped_lock<mutex> lock; //at the start of your class
lock l(_sync); //in your function.

Не думаю, что это так плохо ....

...