C++11 并发指南六 atomic 类型详解二 stdatomic.docx
- 文档编号:26702185
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:24
- 大小:22.42KB
C++11 并发指南六 atomic 类型详解二 stdatomic.docx
《C++11 并发指南六 atomic 类型详解二 stdatomic.docx》由会员分享,可在线阅读,更多相关《C++11 并发指南六 atomic 类型详解二 stdatomic.docx(24页珍藏版)》请在冰豆网上搜索。
C++11并发指南六atomic类型详解二stdatomic
std:
:
atomic基本介绍
std:
:
atomic是模板类,一个模板类型为T的原子对象中封装了一个类型为T的值。
template
原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(datarace)。
因此从不同线程访问某个原子对象是良性(well-defined)行为,而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义(undifined)行为发生。
C++11标准中的基本std:
:
atomic模板定义如下:
template
boolis_lock_free()constvolatile;
boolis_lock_free()const;
voidstore(T,memory_order=memory_order_seq_cst)volatile;
voidstore(T,memory_order=memory_order_seq_cst);
Tload(memory_order=memory_order_seq_cst)constvolatile;
Tload(memory_order=memory_order_seq_cst)const;
operatorT()constvolatile;
operatorT()const;
Texchange(T,memory_order=memory_order_seq_cst)volatile;
Texchange(T,memory_order=memory_order_seq_cst);
boolcompare_exchange_weak(T&,T,memory_order,memory_order)volatile;
boolcompare_exchange_weak(T&,T,memory_order,memory_order);
boolcompare_exchange_strong(T&,T,memory_order,memory_order)volatile;
boolcompare_exchange_strong(T&,T,memory_order,memory_order);
boolcompare_exchange_weak(T&,T,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_weak(T&,T,memory_order=memory_order_seq_cst);
boolcompare_exchange_strong(T&,T,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_strong(T&,T,memory_order=memory_order_seq_cst);
atomic()=default;
constexpratomic(T);
atomic(constatomic&)=delete;
atomic&operator=(constatomic&)=delete;
atomic&operator=(constatomic&)volatile=delete;
Toperator=(T)volatile;
Toperator=(T);
};
另外,C++11标准库std:
:
atomic提供了针对整形(integral)和指针类型的特化实现,分别定义如下:
针对整形(integal)的特化,其中integal代表了如下类型char,signedchar,unsignedchar,short,unsignedshort,int,unsignedint,long,unsignedlong,longlong,unsignedlonglong,char16_t,char32_t,wchar_t:
?
template<>structatomic
boolis_lock_free()constvolatile;
boolis_lock_free()const;
voidstore(integral,memory_order=memory_order_seq_cst)volatile;
voidstore(integral,memory_order=memory_order_seq_cst);
integralload(memory_order=memory_order_seq_cst)constvolatile;
integralload(memory_order=memory_order_seq_cst)const;
operatorintegral()constvolatile;
operatorintegral()const;
integralexchange(integral,memory_order=memory_order_seq_cst)volatile;
integralexchange(integral,memory_order=memory_order_seq_cst);
boolcompare_exchange_weak(integral&,integral,memory_order,memory_order)volatile;
boolcompare_exchange_weak(integral&,integral,memory_order,memory_order);
boolcompare_exchange_strong(integral&,integral,memory_order,memory_order)volatile;
boolcompare_exchange_strong(integral&,integral,memory_order,memory_order);
boolcompare_exchange_weak(integral&,integral,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_weak(integral&,integral,memory_order=memory_order_seq_cst);
boolcompare_exchange_strong(integral&,integral,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_strong(integral&,integral,memory_order=memory_order_seq_cst);
integralfetch_add(integral,memory_order=memory_order_seq_cst)volatile;
integralfetch_add(integral,memory_order=memory_order_seq_cst);
integralfetch_sub(integral,memory_order=memory_order_seq_cst)volatile;
integralfetch_sub(integral,memory_order=memory_order_seq_cst);
integralfetch_and(integral,memory_order=memory_order_seq_cst)volatile;
integralfetch_and(integral,memory_order=memory_order_seq_cst);
integralfetch_or(integral,memory_order=memory_order_seq_cst)volatile;
integralfetch_or(integral,memory_order=memory_order_seq_cst);
integralfetch_xor(integral,memory_order=memory_order_seq_cst)volatile;
integralfetch_xor(integral,memory_order=memory_order_seq_cst);
atomic()=default;
constexpratomic(integral);
atomic(constatomic&)=delete;
atomic&operator=(constatomic&)=delete;
atomic&operator=(constatomic&)volatile=delete;
integraloperator=(integral)volatile;
integraloperator=(integral);
integraloperator++(int)volatile;
integraloperator++(int);
integraloperator--(int)volatile;
integraloperator--(int);
integraloperator++()volatile;
integraloperator++();
integraloperator--()volatile;
integraloperator--();
integraloperator+=(integral)volatile;
integraloperator+=(integral);
integraloperator-=(integral)volatile;
integraloperator-=(integral);
integraloperator&=(integral)volatile;
integraloperator&=(integral);
integraloperator|=(integral)volatile;
integraloperator|=(integral);
integraloperator^=(integral)volatile;
integraloperator^=(integral);
};
针对指针的特化:
?
template
boolis_lock_free()constvolatile;
boolis_lock_free()const;
voidstore(T*,memory_order=memory_order_seq_cst)volatile;
voidstore(T*,memory_order=memory_order_seq_cst);
T*load(memory_order=memory_order_seq_cst)constvolatile;
T*load(memory_order=memory_order_seq_cst)const;
operatorT*()constvolatile;
operatorT*()const;
T*exchange(T*,memory_order=memory_order_seq_cst)volatile;
T*exchange(T*,memory_order=memory_order_seq_cst);
boolcompare_exchange_weak(T*&,T*,memory_order,memory_order)volatile;
boolcompare_exchange_weak(T*&,T*,memory_order,memory_order);
boolcompare_exchange_strong(T*&,T*,memory_order,memory_order)volatile;
boolcompare_exchange_strong(T*&,T*,memory_order,memory_order);
boolcompare_exchange_weak(T*&,T*,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_weak(T*&,T*,memory_order=memory_order_seq_cst);
boolcompare_exchange_strong(T*&,T*,memory_order=memory_order_seq_cst)volatile;
boolcompare_exchange_strong(T*&,T*,memory_order=memory_order_seq_cst);
T*fetch_add(ptrdiff_t,memory_order=memory_order_seq_cst)volatile;
T*fetch_add(ptrdiff_t,memory_order=memory_order_seq_cst);
T*fetch_sub(ptrdiff_t,memory_order=memory_order_seq_cst)volatile;
T*fetch_sub(ptrdiff_t,memory_order=memory_order_seq_cst);
atomic()=default;
constexpratomic(T*);
atomic(constatomic&)=delete;
atomic&operator=(constatomic&)=delete;
atomic&operator=(constatomic&)volatile=delete;
T*operator=(T*)volatile;
T*operator=(T*);
T*operator++(int)volatile;
T*operator++(int);
T*operator--(int)volatile;
T*operator--(int);
T*operator++()volatile;
T*operator++();
T*operator--()volatile;
T*operator--();
T*operator+=(ptrdiff_t)volatile;
T*operator+=(ptrdiff_t);
T*operator-=(ptrdiff_t)volatile;
T*operator-=(ptrdiff_t);
};
std:
:
atomic成员函数
好了,对std:
:
atomic有了一个最基本认识之后我们来看std:
:
atomic的成员函数吧。
std:
:
atomic构造函数
std:
:
atomic的构造函数如下:
default
(1)
atomic()noexcept=default;
initialization
(2)
constexpratomic(Tval)noexcept;
copy[deleted](3)
atomic(constatomic&)=delete;
1.默认构造函数,由默认构造函数创建的std:
:
atomic对象处于未初始化(uninitialized)状态,对处于未初始化(uninitialized)状态std:
:
atomic对象可以由atomic_init函数进行初始化。
2.初始化构造函数,由类型T初始化一个std:
:
atomic对象。
3.拷贝构造函数被禁用。
请看下例:
?
#include
:
cout
#include
:
atomic,std:
:
atomic_flag,ATOMIC_FLAG_INIT
#include
:
thread,std:
:
this_thread:
:
yield
#include
:
vector
//由false初始化一个std:
:
atomic
std:
:
atomic
std:
:
atomic_flagwinner=ATOMIC_FLAG_INIT;
voiddo_count1m(intid)
{
while(!
ready){std:
:
this_thread:
:
yield();}//等待ready变为true.
for(volatileinti=0;i<1000000;++i){}//计数
if(!
winner.test_and_set()){
std:
:
cout<<"thread#"< \n"; } } intmain() { std: : vector : thread>threads; std: : cout<<"spawning10threadsthatcountto1million...\n"; for(inti=1;i<=10;++i)threads.push_back(std: : thread(count1m,i)); ready=true; for(auto&th: threads)th.join(); return0; } std: : atomic: : operator=()函数 std: : atomic的赋值操作函数定义如下: setvalue (1) Toperator=(Tval)noexcept; Toperator=(Tval)volatilenoexcept; copy[deleted] (2) atomic&operator=(constatomic&)=delete; atomic&operator=(constatomic&)volatile=delete; 可以看出,普通的赋值拷贝操作已经被禁用。 但是一个类型为T的变量可以赋值给相应的原子类型变量(相当与隐式转换),该操作是原子的,内存序(MemoryOrder)默认为顺序一致性(std: : memory_order_seq_cst),如果需要指定其他的内存序,需使用std: : atomic: : store()。 ? #include : cout #include : atomic #include : thread,std: : this_thread: : yield std: : atomic voidset_foo(intx) { foo=x;//调用std: : atomic: : operator=(). } voidprint_foo() { while(foo==0){//waitwhilefoo==0 std: : this_thread: : yield(); } std: : cout<<"foo: "< } intmain() { std: : threadfirst(print_foo); std: : threadsecond(set_foo,10); first.join(); second.join(); return0; } 基本std: : atomic类型操作 本节主要介绍基本std: : atomic类型所具备的操作(即成员函数)。 我们知道std: : atomic是模板类,一个模板类型为T的原子对象中封装了一个类型为T的值。 本文 : atomic基本介绍>一节中也提到了std: : atomic类模板除了基本类型以外,还针对整形和指针类型做了特化。 特化的std: : atomic类型支持更多的操作,如fetch_add,fetch_sub,fetch_and等。 本小节介绍基本std: : atomic
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+11 并发指南六 atomic 类型详解二 stdatomic C+ 11 并发 指南 类型 详解