在 GCC 中实现通用原子加载或存储的更好方法?
我知道 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;
}
I am aware of GCC's builtin atomic operations: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html
But this list doesn't include very simple operations like load and store. I could implement these on limited architectures with inline assembly (in fact for many like x86 they will be basically just regular mov's), but is there no better way in the general case than something like this:
// 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 test_and_set 实现低级互斥锁。 在我看来,加载函数是一个很好的函数,但是存储函数应该使用 test_and_set 而不是必须
防止错误。
You could implement low level mutex with test_and_set. The load function is a good one imo, but you store function should use test_and_set instead of having
to prevent errors.