You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If I am not mistaken, it is possible for another thread to signal between the load and the compare_exchange_strong which would result in a spurious failure. I think this is commonly referred to as a "weak-try" but if that was the intent then using compare_exchange_weak would be sufficient. I only see this code being used in one single place in this project, and in that instance the strong/weak distinction wouldn't be relevant.
I'm certainly no expert on the topic of C++11 atomic operations, so I could be mistaken.
To clarify, the issue is that it seems to be possible for tryWait to return false while the semaphore is positive because CAS could fail from a signal() in another thread. The only resolution I can think of would be to loop:
int oldCount;
while (1)
{
oldCount = m_count.load(std::memory_order_relaxed);
if (oldCount <= 0) returnfalse;
if (m_count.compare_exchange_weak(oldCount, oldCount - 1, std::memory_order_acquire)) returntrue;
}
But while(1) in a method called try... sounds obscene, even if in even the worst case this would only actually loop very infrequently.
Activity
[-]weak-try?[/-][+]LightweightSemaphore weak-try?[/+]Caldfir commentedon Jul 5, 2021
To clarify, the issue is that it seems to be possible for
tryWaitto returnfalsewhile the semaphore is positive because CAS could fail from asignal()in another thread. The only resolution I can think of would be to loop:But
while(1)in a method calledtry...sounds obscene, even if in even the worst case this would only actually loop very infrequently.