1、 原子操作:std::atomic
原理概念:
【1】原子操作可以理解为,不需要用到互斥量加锁(无锁)技术的d的多线程并发编程方式
也可以理解成,原子操作在多线程中不会被打断的程序执行片段;
【2】原子操作比互斥量在效率上更高;
【3】互斥量的加锁一般是针对一个代码段(几行代码),原子操作针对的都是一个变量,而不是针对一个代码段;
原子操作:该变量要么完成,要么没完成,不存在中间状态
std::atomic代表原子操作。std::atomic是一个类模板,用于封装某个类型的值;
互斥量:多线程中保护共享数据; 锁,操作共享数据;开锁,其他线程获取该共享数据权限
有两个线程,对一个变量进行操作,一个线程读,一个线程写
#ifndef ATOMIC_HPP
#define ATOMIC_HPP
#include <thread>
#include <mutex>
#include <iostream>
std::mutex g_Mutex;
int g_count = 0;
std::atomic<int> g_aCount = 0; // 封装一个int类型的对象 ,使用与int变量相同
std::atomic<bool> g_AtomicBoolVal = false; // 原子操作,线程退出标记,防止多线程调用出现错误
void atomicBoolTest()
{
std::chrono::milliseconds dura(1000);
while (g_AtomicBoolVal == false)
{
std::cout << "thread ID = " << std::this_thread::get_id() << " start " << std::endl;
std::this_thread::sleep_for(dura);
}
std::cout << "thread ID = " << std::this_thread::get_id() << " endding " << std::endl;
return;
}
void ThreadsGet()
{
for (int i = 0; i < 10000000; i++)
{
//g_Mutex.lock();
//g_count++;
//g_Mutex.unlock();
g_aCount++; // 变量使用类似于普通的int类型
}
return;
}
bool atomicFun()
{
std::thread t1(ThreadsGet);
std::thread t2(ThreadsGet);
t1.join();
t2.join();
std::cout << "g_count = " << g_aCount << std::endl;
return true;
}
bool atomicBool()
{
std::thread t1(atomicBoolTest);
std::thread t2(atomicBoolTest);
std::chrono::milliseconds dura(2000);
std::this_thread::sleep_for(dura);
g_AtomicBoolVal = true;
t1.join();
t2.join();
std::cout << "running out" << std::endl;
return true;
}
#endif