1. 作用及场景
作用: 原子操作, 不需要互斥量加锁解锁的无锁技术;
场景: 针对的是一个变量;
效率比互斥量高;用在多线程中不会被打断;
using atomic_bool = atomic<bool>;
using atomic_char = atomic<char>;
using atomic_schar = atomic<signed char>;
using atomic_uchar = atomic<unsigned char>;
using atomic_short = atomic<short>;
using atomic_ushort = atomic<unsigned short>;
using atomic_int = atomic<int>;
using atomic_uint = atomic<unsigned int>;
using atomic_long = atomic<long>;
using atomic_ulong = atomic<unsigned long>;
using atomic_llong = atomic<long long>;
using atomic_ullong = atomic<unsigned long long>;
2. 使用
atomic针对++,-- ,+=, |=,&=,=是支持的,其他的可能不支持;
std::atomic_int g_count = 0;
std::mutex g_mutex;
int g_count1 = 0;
void funcProc()
{
for (int i = 0; i < 1000000; i++) {
g_count++;
//std::lock_guard<std::mutex> lock(g_mutex);
//g_count1++;
}
}
int main()
{
clock_t startT = clock();
std::thread myObj1(funcProc);
std::thread myObj2(funcProc);
myObj1.join();
myObj2.join();
clock_t elaspedT = clock() - startT;
std::cout << g_count << " elaspedT=" << elaspedT << "ms" << std::endl;
//原子操作时间 < 加锁
return 0;
}
3. 成员函数
_TVal load():以原子的方式读取atomic的值
void store(const _TVal _Value): 以原子的方式写入值value;
void funcProc()
{
std::atomic_int g_count = 0;
g_count++;
//以原子的方式读atomic对象的值;
std::atomic_int atm(g_count.load());
//以原子方式写入内容;
atm.store(10);
std::cout << g_count << " atm=" << atm << std::endl; //1 10
}