Is the get_a()
function safe for race-conditions or do I need to explicitly copy str_
as in get_b()
in order to have a thread-safe function?
class Class {
public:
auto get_a() -> std::string {
auto&& guard = std::lock_guard{mutex_};
return str_;
}
auto get_b() -> std::string {
auto&& guard = std::lock_guard{mutex_};
auto str = str_;
return str;
}
private:
std::mutex mutex_{};
std::string str_{};
};
Note: I'm aware that there are similar questions here on Stack Overflow, but I could not find one which explicitly answers this question.
[stmt.return]p3:
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 of the block enclosing thereturn
statement.
This means that the following happen in order:
So, we can infer that get_a
is completely safe.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With