C++11提供了一个原子类型std::atomic<T>,可以使用任意类型作为模板参数,C++11内置了整型的原子变量,可以更方便的使用原子变量,使用原子变量就不需要使用互斥量来保护该变量了,用起来更简洁。例如,要做一个计数器,使用mutex是这样的,如下代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
int value = 0;
std::mutex g_mutex;
void increment()
{
for(int i = 0; i < 10; i++)
{
std::lock_guard<std::mutex> lock(g_mutex);
++value;
cout << "increment value: " << value << endl;
}
}
void decrement()
{
for(int i = 0; i < 10; i++)
{
std::lock_guard<std::mutex> lock(g_mutex);
--value;
cout << "decrement value: " << value << endl;
}
}
int main()
{
thread t1(increment);
thread t2(decrement);
t1.join();
t2.join();
return 0;
}
如果使用了原子变量,就不需要再定义互斥量了,使用更方便了,如下代码清单:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <atomic>
using namespace std;
std::atomic<int> value;
void increment()
{
for(int i = 0; i < 10; i++)
{
++value;
cout << "increment value: " << value.load() << endl;
}
}
void decrement()
{
for(int i = 0; i < 10; i++)
{
--value;
cout << "decrement value: " << value.load() << endl;
}
}
int main()
{
thread t1(increment);
thread t2(decrement);
t1.join();
t2.join();
return 0;
}