4 ms·
Wait why is this a footgun?
by kajaktum 4y ago
Wait why is this a footgun?
- akling 4y agoBecause now you're holding a reference to `x` which is supposed to be protected by a mutex, even after the mutex is unlocked. With the lambda-only API, it's much harder to make this mistake, since a temporary reference like this will still go out of scope at the end of the lambda expression.
- kajaktum 4y agoYou specifically mentioned that this is a footgun: > auto& x = state.locked()->x; But I don't see how the reference here is gonna make a difference unless i am reading the lifetime of the lock here incorrectly. For example, this is perfectly fine right? ``` { auto& x = state.locked()->x; } ``` This will only be a problem if you have an outside struct that holds a reference ``` auto &a = "something"; { auto& x = state.locked()->x; a = x; } ``` Which can still happen even if you use a lambda.
- MontagFTB 4y agoHolding the reference to a field that is protected by a mutex implies there is another thread out there that will race with your reference in either reading or writing it. Even just a read is racy, as there is no “atomic read” of any size value if it is not already wrapped as atomic.