C++11并发编程关于原子操作并发编程关于原子操作atomic的代码示例的代码示例
今天小编就为大家分享一篇关于C++11并发编程关于原子操作atomic的代码示例,小编觉得内容挺不错的,现
在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
一:概述一:概述
项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这
种方式。
为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一个线程执行过程中可能被内核临时挂起,这就
是线程切换,当内核再次切换到该线程时,之前的数据可能已被修改,不能保证原子操作。
C++11提供了个原子的类和方法atomic,保证了多线程对变量原子性操作,相比加锁机制mutex.lock(),mutex.unlock(),性能
有几倍的提升。
所需头文件<atomic>
二:错误代码二:错误代码
//全局变量
int g_num = 0;
void fun()
{
for (int i = 0; i < 10000000; i++)
{
g_num++;
}
return ;
}
int main()
{
//创建线程1
thread t1(fun);
//创建线程2
thread t2(fun);
t1.join();
t2.join();
cout << g_num << endl;
getchar();
return 1;
}
应该输出结果20000000,实际每次结果都不一样,总是小于该值,正是由于多线程操作同一变量而没有保证原子性导致的。
三:加锁代码三:加锁代码
//全局变量
int g_num = 0;
mutex m_mutex;
void fun()
{
for (int i = 0; i < 10000000; i++)
{
m_mutex.lock();
g_num++;
m_mutex.unlock();
}
return ;
}
int main()
{
//获取当前毫秒时间戳
typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type;
microClock_type tp1 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
long long time1 = tp1.time_since_epoch().count();
//创建线程
thread t1(fun);
thread t2(fun);
t1.join();
t2.join();
cout << "总数:" << g_num << endl;
//获取当前毫秒时间戳
microClock_type tp2 = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
long long time2 = tp2.time_since_epoch().count();
cout << "耗时:" << time2 - time1 << "ms" << endl;
getchar();