我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!!
先来看下面这段简单的代码:
int g_num = 0;
void print(int id)
{
for (int i = 0; i < 5; i++)
{
++g_num;
cout << "id = " << id << "==>" << g_num << endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
thread tha(print, 0);
thread thb(print, 1);
tha.join();
thb.join();
return 0;
}
上述代码功能大致就是在线程tha和thb中运行函数print,每个线程对g_num进行加加一次,最后加出来的g_num的值应该是10,那么我们现在来看结果:
我们看到运行结果,为什么打印结果最后,按理来说两个线程各加五次,最后结果应该是10呀,怎么会是9呢?
如上图所示,是因为++这个运算符不是原子操作(不会被线程调度机制打断的操作),我们可以将g_num设置为原子数,改为atomic_int g_num = 0;
atomic_int g_num = 0; //将g_num设置为原子操作数
//atomic<int> g_num = 0;这个和上面是一样的 下面这行是模板化之后的
void print(int id)
{
for (int i = 0; i < 5; i++)
{
++g_num;
cout << "id = " << id << "==>" << g_num << endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
thread tha(print, 0);
thread thb(print, 1);
tha.join();
thb.join();
return 0;
}
将g_num设置为原子操作数之后,在++阶段就不会被线程调度机制给打断,我们来看运行结果: