互动网站建设公司,网站怎么做才不会被墙,拓者室内设计论坛官方网,做58一样的网站1.引言 std::atomic是一个c的模板类#xff0c;为了解决线程访问共享资源时出现数据竞争问题。atomic的翻译成中文的意思是原子的#xff0c;这里指的就是原子操作的意思。什么是原子操作呢#xff1f;看到一个代码示例讲的挺好的。
int value 0;
void atomic_function() …1.引言 std::atomic是一个c的模板类为了解决线程访问共享资源时出现数据竞争问题。atomic的翻译成中文的意思是原子的这里指的就是原子操作的意思。什么是原子操作呢看到一个代码示例讲的挺好的。
int value 0;
void atomic_function() {for (int i 0; i 100; i)value 1;
} 我们在线程A里面调用以上atomic_function函数时我们在线程B里观察value的结果。如果是原子操作那么观察的value值要么是0要么是100如果是非原子操作value的值被观测时可能是0~100的任何一个整数值。示例中函数不加特殊处理肯定不是原子操作只是拿来理解原子操作的概念。
2. 基本信息
头文件 #include atomic
类型定义 template class T struct atomic;
3.对于整数类型的示例化
std::atomic模板类可对以下整数类型进行实例化 字符类型 char char8_t (C20) char16_t char32_t wchar_t 标准有符号整数类型 signed char short int long long long 标准无符号整数类型 unsigned char unsigned short unsigned int unsigned long unsigned long long std::atomic模板类对以上整数类型的实例化对象提供原子操作例如 fetch_add fetch_sub fetch_and fetch_or fetch_xor 4 std::atomicint的原子操作fetch_add使用demo
fetch_add的函数原型
T fetch_add
(T arg, std::memory_order order std::memory_order_seq_cst
); 参数 arg - 算术加法的另一参数 order - 强制的内存顺序制约默认情况下为std::memory_order_seq_cst 。 内存顺序制约比较难理解初学暂且放下。接下来看fetch_add的使用案例。文件名atomic.c
#includeiostream
#includethread
#includeatomicstd::atomicint atomic_data;void AtomicAdd(void)
{for(int i 0; i 1000000; i){atomic_data.fetch_add(1);}
}int main(int argn, char* argv[])
{std::cout hello atomic fetch_add std::endl;std::thread th1(AtomicAdd);std::thread th2(AtomicAdd);std::thread th3(AtomicAdd);th1.join();th2.join();th3.join();std::cout atomic_data Val: atomic_data std::endl;return 0;
}
同目录下写一个简单的Makefile省的每次都写g编译语句如下
TGT : main
SRC : atomic.c
OPTION : -I.
OPTION -pthreadall: $(TGT)echo make sucessfull$(TGT):$(SRC)g -stdc11 $^ $(OPTION) -o $clean:rm $(TGT)
.PHONY: all clean
编译后运行结果如下 hello atomic fetch_add atomic_data Val:3000000