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.
The text was updated successfully, but these errors were encountered:
Caldfir
changed the title
weak-try?
LightweightSemaphore weak-try?
Jul 5, 2021
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.
Reading through the code here, I noted the following implementation of
LightweightSemaphore::tryWait()
:cpp11-on-multicore/common/sema.h
Line 201 in 41ac9c7
If I am not mistaken, it is possible for another thread to signal between the
load
and thecompare_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 usingcompare_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.
The text was updated successfully, but these errors were encountered: