C++11并发与多线程总结(九) -- 原子操作atomic简介

文章目录

(一) 线程概念、创建及传参
(二) 独占互斥锁–mutex,lock_guardy与其他mutex
(三) unique_lock替换lock_guardy
(四) 单例模式(Singleton)下的线程安全问题
(五) window临界区
(六) condition_variable条件变量
(七) std::async异步任务与std::future< >
(八) packaged_task< >与promise< >
(九) 原子操作atomic<>简介

(1)简介
  1. 若多个线程操作一个共享数据,而共享数据只是简单的操作,若使用锁来对其进行保护,效率十分低下
  2. 引入原子操作,即不需要互斥量的多线程并发保护
  3. 其使用方式类似于普通数据,多个线程对其操作的过程不会打断其完整的数据写入,即不会出现中间状态
  4. 只针对单个变量,一般用于计数统计

(2)使用方式

1.模板类,定义后与变量使用方式一致
2.不需要用到互斥量加锁的多线程并发模式
3.其对数据的操作过程不可分割,保证数据安全,效率比lock高
4.一般只针对一个变量,用于并发的自加自减,一般用于计数统计
5.只适用于 ++ – += &= |= ^= 其他的数据可能会出错例如 a = a + 1
6.不可直接使用拷贝构造 和 赋值
7.读入可使用load()如下
atomic atm1 = 0;
atm1++;
atomic atm2(atm1.load());
或 auto atm2 = atm1.load();
8.写可使用store() atm2.store(666);

  • 相当于模板类
		std::atomic<int> atmnum(10);  //初始化一个值为10的int型原子类
  • 不能直接使用构造函数进行创建
  • 只能使用特定操作符,否则数据一样出错

  • 测试代码
	int commVar = 0;
	std::mutex mtx;

	//自增一百万次若使用mutex则效率极低
	void Write(){
	        for (size_t i = 0; i < 1000000; i++) {
	                mtx.lock(); 
	                commVar++;
	                mtx.unlock();
	        }
	        return;
	}
	
	int main(int argc, char const *argv[]){
	
	        std::thread t1(Write);
	        std::thread t2(Write);
	
	        t1.join();
	        t2.join();
	
	        std::cout<<commVar<<std::endl;
	        std::cout<<"main thread.\n";
	}

你可能感兴趣的:(C++11并发与多线程总结)