Mark, I'm trying to write an arm64 test to reproduce the spurious failure from
`std::atomic::compare_exchange_weak()`, but I'm not able to reproduce it.
Do you have any thoughts on how I can test this?
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Mark, I'm trying to write an arm64 test to reproduce the spurious failure from
`std::atomic::compare_exchange_weak()`, but I'm not able to reproduce it.Do you have any thoughts on how I can test this?
Mark, I'm trying to write an arm64 test to reproduce the spurious failure from
`std::atomic::compare_exchange_weak()`, but I'm not able to reproduce it.Do you have any thoughts on how I can test this?
Nothing immediately comes to mind.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
[ScopedSpinGuard] Use std::atomic::compare_exchange_strong() for spinlock
Previously, ScopedSpinGuard used std::atomic::compare_exchange_weak()
in a loop to implement a spinlock. After looping for the specified
number of nanoseconds, it would give up and return an error.
A few bugs have come in on ARM platforms (https://crbug.com/340980960,
http://b/296082201) which indicate that this can fail even in
single-threaded cases where nothing else has the spinlock.
From https://cbloomrants.blogspot.com/2011/07/07-14-11-compareexchangestrong-vs.html :
> compare_exchange_weak exists for LL-SC (load linked/store
> conditional) type architectures (Power, ARM, basically everything
> except x86), because on them compare_exchange_strong must be
> implemented as a loop, while compare_exchange_weak can be
> non-looping.
and:
https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange#Notes
> compare_exchange_weak is allowed to fail spuriously, that is, acts
> as if *this != expected even if they are equal. When a
> compare-and-exchange is in a loop, compare_exchange_weak will yield
> better performance on some platforms.
>
> When compare_exchange_weak would require a loop and
> compare_exchange_strong would not, compare_exchange_strong is
> preferable [...]
My conclusion is that this logic needs to use
`compare_exchange_strong` to avoid spurious failures on ARM in the
common case when there's no other thread holding the spinlock.
Change-Id: I2a08031db6b219d7d14a5cd02b3634985f81ab06
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |