前言
多线程的一个重要问题就是并发,但是这个并发不是简单的一个线程访问A段内存,一个线程访问B段线程,这样显然不会出现任何问题。但是一旦两个线程同时访问同一段内存就会出现未知的错误。在前面讲过了使用互斥元的方法,可以保证只有一个线程能访问易发生冲突的内存区域。另外一种方法就是使用原子变量同步。
atomic
原子类型在头文件<atomic>
中,使用atomic
有两套命名模式:一种是使用替代名称,一种是使用atomic
的特化。
原子类型 | 对应特化 |
---|---|
atomic_bool | atomic< bool > |
atomic_char | atomic< char > |
atomic_int | atomic< int > |
… | … |
在同一个程序中不要混用两种方式,容易出现代码不可移植。
通常atomic
仅限一下这几种操作:load()
,store()
,exchange()
,compare_exchange_weak()
,compare_exchange_strong()
。
但是对于其中特殊的atomic_flag
必须使用ATOMIC_FLAG_INIT
进行初始化,只能有三类操作,分别是销毁、清除和设置并查询,对应的就是析构函数、clear()
函数以及test_and_set()
函数。并且atomic_flag
不允许拷贝构造和拷贝赋值。
下面看一个例子:
class my_mutex {
atomic_flag flag;
public:
my_mutex():flag(ATOMIC_FLAG_INIT){
}
void lock(){
while (flag.test_and_set(std::memory_order_acquire));
}
void unlock(){
flag.