多线程死锁

来源:互联网 发布:nginx修改403页面 编辑:程序博客网 时间:2024/05/29 03:20


/*死锁:二个线程同时锁住一个变量时。锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。*//*注意死锁是因为二个函数的加锁与解锁的顺序有关...如下面的代码:函数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 100000mutex 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();}


0 0
原创粉丝点击