Ищем функцию (или макрос) для возврата boost::scoped_lock

Я ищу идею сокращения кода. я использую 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 ответа

Решение
#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
}

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

Не...

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

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

Я бы подумал, что твой замок будет скомпилирован вообще.

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

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

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

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

Другие вопросы по тегам