在C++中,支持了多线程,下面就来学习一下C++中的线程库thread:
先来看下面的代码:
#include <thread>
#include <atomic>
#include <mutex>
using namespace std;
unsigned long sum;
void fun(size_t num)
{
for (size_t i = 0; i < num; i++)
{
sum++;
}
}
int main()
{
thread t1(fun, 1000000);
thread t2(fun, 1000000);
//当这个数很大的时候,就可以看到多线程对共享数据的操作就会出错
t1.join();//join用来等线程结束后,回收创建线程的资源
t2.join();
cout << sum << endl;
return 0;
}
看到以下结果:对于我们预期的结果应该是t1对sum++1000000,t2对sum++1000000,应该得到2000000,但结果并不是

因为多线程对共享数据操作的时候,访问数据不安全(线程安全)的问题,导致了sum并没有按照预期的结果进行
解决方法:
1.加锁:

本文介绍了C++11引入的线程库thread,通过一个例子展示了多线程环境下共享数据操作的安全问题。针对这个问题,提出了两种解决方案:1) 使用unique_lock进行加锁处理,确保线程安全,但可能引发死锁并降低效率;2) 利用C++11的原子操作atomic,提供线程安全且高效的共享数据访问。
最低0.47元/天 解锁文章
9364

被折叠的 条评论
为什么被折叠?



