Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

It is also very useful for some lockfree algorithms, e.g. to fit a pointer and a sequence number within a 64-bit value.


You should be very careful when doing that. It may be rare in practice, but it's surprisingly easy to trigger ABA issues with only a 16-bit sequence number.


Don't you need 65k threads all contending on the same state for that to happen? Even if your process does have 65k threads, you'd need a pretty large critical section for all of them to be preempted in an unlucky point.

That said, it's better to rely on RCU/hazptr to solve ABA issues, but the extra bits are still useful to store state that can be CAS'd together with the pointer.


Cannot edit anymore but I realized that my comment was wrong :) You just need 2 threads, as long as one is suspended long enough.


I don't really believe that it is easy to trigger. The thread would have to be preempted at a very specific point for a very specific duration, the other thread(s) would need to perform exactly 2^16 operations within that time window and the final operation would need to trigger the ABA problem. Possible, but extremely unlikely. (In some applications even impossible.) Do you happen to have some real world examples?

But yes, it is definitely something to be aware of!

BTW, if the pointers are always aligned, the sequence number may have a few bits more.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: