/*
死锁:二个线程同时锁住一个变量时。
锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。
*/
/* 注意死锁是因为二个函数的加锁与解锁的顺序有关...如下面的代码:
函数add1:
g_mutex1.lock();
(*a)++;
g_mutex2.lock();
(*b)++;
g_mutex1.unlock();
g_mutex2.unlock();
函数add2:
g_mutex2.lock(); //加锁
g_mutex1.lock();
(*a)++;
g_mutex1.unlock();
(*b)++;
g_mutex2.unlock();
*/
#include<iostream>
#include<thread>
#include<mutex>
#include<Windows.h>
using namespace std;
//trhead:引用类型一般用在函数,而 thread 是模板,避免类型转换,尽量使用指针。
#define COUNT 100000
mutex g_mutex1, g_mutex2; //互斥量
void add1(int *a,int *b)
{
for (int i = 0; i < COUNT; i++)
{
/* 死锁的情况 于下面的add2函数合用。
g_mutex1.lock();
(*a)++;
g_mutex2.lock();
(*b)++;
g_mutex1.unlock();
g_mutex2.unlock();*/
g_mutex1.lock();
(*a)++; //注意这儿锁的变量顺序。
g_mutex1.unlock();
g_mutex2.lock();
(*b)++;
g_mutex2.unlock();
//Sleep(3000);
}
}
void add2(int *a, int *b)
{
for (int i = 0; i < COUNT; i++)
{
//g_mutex2.lock(); //加锁
//g_mutex1.lock();
//(*a)++;
//g_mutex1.unlock();
//(*b)++;
//g_mutex2.unlock();
g_mutex2.lock(); //加锁
(*b)++;
g_mutex2.unlock();
g_mutex1.lock();
(*a)++;
g_mutex1.unlock();
//Sleep(3000);
}
}
void main()
{
int a = 0;
int b = 0;
thread th1(add1, &a, &b);
thread th2(add2, &a, &b);
th1.join();
th2.join();
while (1)
{
cout <<"a:"<< a << endl;
cout <<"b:"<< b << endl;
this_thread::sleep_for(chrono::seconds(3));
}
cin.get();
}
还没有评论,来说两句吧...