面試官要求用c++寫一個死鎖的程序。
目前想到兩種簡單的寫法,一種是單線程對一個資源重複申請上鎖;第二種是兩個線程對兩個資源申請上鎖,形成環路。
實現1
#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>
using namespace std;
int data = 1;
mutex mt1,mt2;
void a2() {
data = data * data;
mt1.lock(); //第二次申請對mt1上鎖,但是上不上去
cout<<data<<endl;
mt1.unlock();
}
void a1() {
mt1.lock(); //第一次對mt1上鎖
data = data+1;
a2();
cout<<data<<endl;
mt1.unlock();
}
int main() {
thread t1(a1);
t1.join();
cout<<"main here"<<endl;
return 0;
}
實現2
#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>
using namespace std;
int data = 1;
mutex mt1,mt2;
void a2() {
mt2.lock();
sleep(1);
data = data * data;
mt1.lock(); //此時a1已經對mt1上鎖,所以要等待
cout<<data<<endl;
mt1.unlock();
mt2.unlock();
}
void a1() {
mt1.lock();
sleep(1);
data = data+1;
mt2.lock(); //此時a2已經對mt2上鎖,所以要等待
cout<<data<<endl;
mt2.unlock();
mt1.unlock();
}
int main() {
thread t2(a2);
thread t1(a1);
t1.join();
t2.join();
cout<<"main here"<<endl; //要t1線程、t2線程都執行完畢後纔會執行
return 0;
}
上述代碼執行後3處cout都不會打印信息,a1和a2互相死等,形成死鎖。