我知道GCC的内置原子操作:http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html
但是这个列表不包括加载和存储等非常简单的操作.我可以在内联汇编的有限架构上实现这些(事实上对于许多像x86一样,它们基本上只是普通的mov),但是在一般情况下没有比这样的更好的方法:
// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
return __sync_fetch_and_add(ptr, 0);
}
// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
void *oldval = atomic_load_ptr(ptr)
void *oldval2;
do {
oldval2 = oldval;
} while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
return oldval;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 test_and_set 实现低级互斥锁。在我看来,加载函数是一个很好的函数,但是存储函数应该使用 test_and_set 而不是
while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
Run Code Online (Sandbox Code Playgroud)
以防止错误。
| 归档时间: |
|
| 查看次数: |
3005 次 |
| 最近记录: |