``` void *a = malloc(10); ``` Results with: ``` movl $10, %edi call malloc movq %rax, -8(%rbp) ``` ``` void *a = 0; __sync_bool_compare_and_swap(&a, 0, malloc(10)); ``` Results with: ``` movl $10, %edi call malloc movq %rax, %rdx movl $0, %eax lock cmpxchgq %rdx, -8(%rbp) ``` ``` void *a = 0; __sync_lock_test_and_set(&a, malloc(10)); ``` Results with: ``` movq $0, -8(%rbp) movl $10, %edi call malloc xchgq -8(%rbp), %rax ``` The `LOCK` prefix essentially means that the current CPU has ownership of the cache line for the duration of the operation, so you get the atomicity for the memory access. All the internet says that `xchgq` has implicit `LOCK` if one of it's arguments is a memory address, which is the case here, so indeed `__sync_bool_compare_and_swap` and `__sync_lock_test_and_set` should roughly have the same penalty. --- Reply to this email directly or view it on GitHub: https://github.com/xrootd/xrootd/pull/266#issuecomment-122022123 ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the XROOTD-DEV list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1