Работает ли RAII когда вызываешь return?

210
18 июля 2018, 08:20

Есть код:

class Foo {
public:
    std::chrono::steady_clock::time_point GetVal() {
        std::unique_lock<std::mutex> lock(common_mutex_);
        return val; // Является ли возврат val в этом случае безопасным ??? 
    };
    void SetVal(std::chrono::steady_clock::time_point new_val) {
        std::unique_lock<std::mutex> lock(common_mutex_);
        val = new_val;
    };
private:
    std::mutex common_mutex_;
    std::chrono::steady_clock::time_point val{0};
};

Объекты Foo будут вызывается из множества потоков. Является ли return val в этом случае безопасным или уничтожение объекта lock происходит раньше, чем код вызвавший метод получит возвращаемое значение? Регламентирует ли как-то это стандарт? Можно ли как то сделать std::chrono::steady_clock::time_point атомарным без применения мьютекса (например как то сделать его объектом atomic)?

Answer 1

Этот код является корректным так как стандарт прямо задает, что разрушение локальных переменных с автоматическим хранением происходит после создания результата:

9.6.3 The return statement [stmt.return]

3 The copy-initialization of the result of the call is sequenced before the destruction of temporaries at the end of the full-expression established by the operand of the return statement, which, in turn, is sequenced before the destruction of local variables (9.6) of the block enclosing the return statement.

Что касается избавления от мьютекса, то тут разве что вариант с хранением atomic<uint64_t> с секундами может сработать.

READ ALSO
ошибка с vector push_back

ошибка с vector push_back

Есть 2 класса А и В нужно создать контейнер отдельно для каждого класса через метод create который template котрый заполняет контейнер типом в зависимости...

188
синтаксический аналог memcpy

синтаксический аналог memcpy

помогите сделать без memcpy то же самое:

179
ESP8266 SPI slave mode interrupt (Arduino IDE)

ESP8266 SPI slave mode interrupt (Arduino IDE)

Есть необходимость запустить аппаратный (желательно) SPI в режиме slave на ESP12f (ESP8266)SPI0 используется для доступа к флешке - его не трогаем

327