4 ms·
Im pretty sure the same construct can be implemented without the compare: int lock = 0; void AcquireLock(int *lock){ while (ATOMIC_SWAP(lock, 1)){
by chacham15 5y ago
Im pretty sure the same construct can be implemented without the compare:
int lock = 0;
void AcquireLock(int *lock){
while (ATOMIC_SWAP(lock, 1)){
sleep(10); //or futex or w/e
}
}
void ReleaseLock(int *lock){
ATOMIC_SWAP(lock, 0);
}
- ww520 5y agoThe 'lock' variable is shared among threads. Compare is needed to avoid stomping on the lock acquired by another thread.
- dragontamer 5y agoNo it isn't. If lock = 1, you set the lock to 1 (aka do nothing). If the lock is 0, you know it is unlocked and know you succeeded in acquiring the lock. If many threads try to atomic swap, only one of them gets the zero. ------ The real issue here is the subtle memory barrier bug in that code.
- ww520 5y agoYou are right. XCHG can do the job to acquire the lock. At least on x86, XCHG does lock the cache line on the address of the variable, so it should be ok.