Как ужесточить рамки при использовании C ++ lock_guard? - PullRequest
1 голос
/ 16 марта 2020

В C ++ lock_guard позволяет вам быть RAII-совместимым при использовании блокировок. Он вызывает lock() при создании lock_guard и unlock() при его уничтожении, когда он выходит из области видимости.

Можно ли сузить область действия lock_guard так, чтобы он был уничтожен раньше, чтобы избежать блокировки дольше, чем необходимо?

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

Я не уверен на 100%, что вы имеете в виду, но вы можете ввести область видимости для std::lock_guard с помощью фигурных скобок, например:

void foo()
{
    // do uncritical stuff

    { 
        // critical part starts here with construction
        std::lock_guard<std::mutex> myLock(someMutex);

        // do critical stuff
    } // critical parts end here with myLock going out of scope

    // do uncritical stuff
}
0 голосов
/ 17 марта 2020

A unique_lock охранник может использоваться вместо lock_guard. unique_lock дает вам те же гарантии RAII, что и lock_guard (вызывает lock() при создании lock_guard и unlock() при уничтожении), а также предоставляет lock() и unlock(), чтобы позволить вам блокировать и разблокировать себя .

С unique_lock вы можете lock() до критического пути и unlock() сразу после.

unique_lock будет вызывать unlock() в деструкторе только при блокировке был приобретен ранее, поэтому нет риска снять блокировку дважды (что приводит к неопределенному поведению).

...