介绍
由于互斥锁“比较重”,适合于临界区代码工作较复杂的情况
系统理论:如果工作量较少(比如就一行递增代码)可以用CAS操作的原子特性即可,CAS是由exchange
/swap
指令实现,无锁队列就是CAS实现的
volatile 防止系统将多线程变量缓存在寄存器中,直接从内存取数据
atomic原子变量使用实例
10个线程分别对变量计数100次
#include <iostream>
#include <thread>
#include <atomic>
#include <list>
using namespace std;
volatile std::atomic_bool isReady = false;
volatile std::atomic_int mycount = 0;
void task()
{
// 等所有线程创建好才开始计数
while (!isReady)
{
std::this_thread::yield(); // 线程让出当前的CPU时间片
}
for (int i = 0; i < 100; ++i)
{
mycount++;
}
}
int main()
{
list<std::thread> tlist;
for (int i = 0; i < 10; ++i)
{
tlist.push_back(std::thread(task));
}
std::this_thread::sleep_for(std::chrono::seconds(3));
isReady = true;// 开始计数
for (std::thread& t : tlist)
{
t.join();
}
cout << "mycount:" << mycount << endl;
return 0;
}
结果是我们预期的1000,可以看出atomic帮我们进行了互斥操作