利用gcc

您所在的位置:网站首页 c语言原子操作或赋值 利用gcc

利用gcc

2024-07-14 00:16| 来源: 网络整理| 查看: 265

利用gcc __sync_系列函数实现原子操作 1、gcc __sync_系列函数介绍

Gcc 4.1.2版本之后,支持内置原子操作。就是说, 不需要引入第三方库(如pthread)的锁保护,即可对 1、2、4、8字节的数值或指针类型,进行原子加/减/与/或/异或等操作。

1)赋值相关的操作 type __sync_fetch_and_add (type *ptr, type value); // 将value加到*ptr上,结果更新到*ptr,并返回操作之前*ptr的值 type __sync_fetch_and_sub (type *ptr, type value, ...) // 从*ptr减去value,结果更新到*ptr,并返回操作之前*ptr的值 type __sync_fetch_and_or (type *ptr, type value, ...) // 将*ptr与value相或,结果更新到*ptr, 并返回操作之前*ptr的值 type __sync_fetch_and_and (type *ptr, type value, ...) // 将*ptr与value相与,结果更新到*ptr,并返回操作之前*ptr的值 type __sync_fetch_and_xor (type *ptr, type value, ...) // 将*ptr与value异或,结果更新到*ptr,并返回操作之前*ptr的值 type __sync_fetch_and_nand (type *ptr, type value, ...) // 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之前*ptr的值 type __sync_add_and_fetch (type *ptr, type value, ...) // 将value加到*ptr上,结果更新到*ptr,并返回操作之后新*ptr的值 type __sync_sub_and_fetch (type *ptr, type value, ...) // 从*ptr减去value,结果更新到*ptr,并返回操作之后新*ptr的值 type __sync_or_and_fetch (type *ptr, type value, ...) // 将*ptr与value相或, 结果更新到*ptr,并返回操作之后新*ptr的值 type __sync_and_and_fetch (type *ptr, type value, ...) // 将*ptr与value相与,结果更新到*ptr,并返回操作之后新*ptr的值 type __sync_xor_and_fetch (type *ptr, type value, ...) // 将*ptr与value异或,结果更新到*ptr,并返回操作之后新*ptr的值 type __sync_nand_and_fetch (type *ptr, type value, ...) // 将*ptr取反后,与value相与,结果更新到*ptr,并返回操作之后新*ptr的值 bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) 2)CAS // 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回true type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...) // 比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回操作之前*ptr的值 3)内存屏障(未进行详细研究) __sync_synchronize (...) // 发出完整内存栅栏 4)自旋锁

相当于c++11中 std::atomic_flag type __sync_lock_test_and_set (type ptr, type value, …) // 将value写入ptr,对ptr加锁,并返回操作之前ptr的值。即,try spinlock语义 void __sync_lock_release (type ptr, …) // 将0写入到ptr,并对*ptr解锁。即,unlock spinlock语义

2、测试例子 1)存取类测试 #include #include #include #include #include int global_int = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_func(void *arg) { int i; for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3