Есть код:
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)?
Этот код является корректным так как стандарт прямо задает, что разрушение локальных переменных с автоматическим хранением происходит после создания результата:
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>
с секундами может сработать.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть 2 класса А и В нужно создать контейнер отдельно для каждого класса через метод create который template котрый заполняет контейнер типом в зависимости...
Есть необходимость запустить аппаратный (желательно) SPI в режиме slave на ESP12f (ESP8266)SPI0 используется для доступа к флешке - его не трогаем