OS단에서 쓰레드 안전을 보장해 주면서 포인터를 바꾸는 명령이라고 합니다.

대충, *ptrA -> *ptrB 로 이동하려면

*ptrOldB =  __sync_lock_test_and_set (&ptrB, ptrA)


ptrB의 원래 포인트가 결과로 리턴되고,
ptrA의 주소가 ptrB로 됩니다.

즉, 
*ptrA = __stnc_lock_test_and_set(&ptrB, ptrA) 하면
ptrA->ptrB로 이동하고 원래 ptrB는 ptrA로 가니 swap이 된다고 하네요.

솔라리스 gcc 에는 atomic_swap_ptr 이 있군요.

논란이 있는것 같지만, 스핀락 구현 같은거 할때 쓸만할 것 같네요
http://stackoverflow.com/questions/9003303/atomic-swap-function-using-gcc-atomic-builtins

__sync_lock_test_and_set

Purpose

This function atomically assigns the value of __v to the variable that __p points to.

An acquire memory barrier is created when this function is invoked.

Prototype

T __sync_lock_test_and_set (T__pT __v, ...);

where T is one of the data types listed in Supported data types.

Parameters

__p
The pointer of the variable that is to be set.
__v
The value to set to the variable that __p points to.

Return value

The function returns the initial value of the variable that __p points to.


Provide feedback ]



출처 : http://pic.dhe.ibm.com/infocenter/comphelp/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.aix.doc%2Fcompiler_ref%2Fbif_gcc_atomic_lock_test_set.html





+ Recent posts