C++中解决线程冲突的二种方式:
一:互斥锁 mutex 要引用 mutex 头文件
二:元子变量 atomic 在头文件 atomic
代码如下:
/*
全局:变量,冲突,结果不正确,速度快。
mutex:结果正确,速度慢。
atomic:结果正确,速度比mutex快。
*/
#include<iostream>
#include<thread>
#include<mutex> //线程互斥量,解决线程安全
#include<atomic> //原子变量,解决线程安全
#include<Windows.h>
using namespace std;
//测试线程安全,多线程访问就会发生线程冲突。
//int num = 0;
//
//void run()
//{
// for (int i = 0; i < 100000; i++)
// {
// num++;
// }
//}
//:二互斥锁解决线程安全
//int num = 0;
//mutex m; //加锁、解锁花费时间。
//void run1()
//{
// m.lock();
// for (int i = 0; i < 100000; i++)
// {
// //互斥锁放在循环里,效率底。
// //m.lock();
// num++;
// //m.unlock();
// }
// m.unlock();
//}
//三:元子量解决线程安全
//注意这儿初始化用的是大括号
atomic_int num{ 0 }; //创建一个元子变量
void run2()
{
for (int i = 0; i < 100000; i++)
{
num++;
}
}
void main()
{
clock_t start = clock();
thread t1(run2);
thread t2(run2);
t1.join();
t2.join(); //等待t1,t2线程运行完成。
//发现结果不对,这就是多线程冲突。
cout << num << endl;
clock_t end = clock();
cout << end - start << endl;
cin.get();
}