[英]Is mutex locks note working properly? Can't Deadlock
所以我試圖制作一個應該死鎖的C ++程序。 通過下面的代碼,我相信它應該可以工作,但不會死鎖。 我的互斥鎖()不能正常工作嗎? 我的意思是,如果mut2.lock()鎖定了關鍵部分,則它應該解鎖,直到正確完成為止,這意味着funcA不應該運行,或者至少等到mut2.unlock()為止,因為它們都使用了資源rs2? 我為什么不能使程序死鎖?
#include <iostream>
#include <thread>
#include <mutex>
#include <pthread.h>
#include <cstdio> // getchar
#include <thread> // this_thread, yield
#include <future> // async
#include <chrono> // seconds
#include <unistd.h>
using namespace std;
mutex mut1, mut2, mut3;
int rs1=1; int rs2 = 2; int rs3=3;
int MAX = 20;
void funcA(){
mut1.lock();
cout<<"mut1 lock for thread A\n";
for(int i=0; i<MAX; i++){
rs2 = i;
cout<<"[Aloop]rs1: "<<rs1<<" rs2: "<<rs2<<" rs3: "<<rs3<<" i:"<<i << endl;
}
rs1 = rs2;
cout<<"[A]rs1: "<<rs1<<" rs2: "<<rs2<<" rs3: "<<rs3 << endl;
mut1.unlock();
cout<<"mut1 unlock for thread A\n";
}
void funcB(){
mut2.lock();
cout<<"mut2 lock for thread B\n";
rs3 = rs1 + rs2;
cout<<"[B]rs3: "<<rs3 << " rs1: "<<rs1 << " rs2: "<<rs2 <<endl;
sleep(50);
mut2.unlock();
cout<<"mut2 unlock for thread B\n";
}
int main(){
thread tA(funcA);
thread tB(funcB);
tA.join();
tB.join();
return 0;
}
//Here is my makefile
#Makefile project 2
project2: project2.o
g++ -std=c++11 -pthread -o project2 project2.o
project2.o: project2.cpp project2.h
g++ -std=c++11 -Wall -pthread -c project2.cpp
//Below is my output
線程B的mut2鎖
[B] rs3:3 rs1:1 rs2:99
線程A的mut1鎖
[Aloop] rs1:1 rs2:0 rs3:3 i:0
[Aloop] rs1:1 rs2:1 rs3:3 i:1
[Aloop] rs1:1 rs2:2 rs3:3 i:2
[Aloop] rs1:1 rs2:3 rs3:3 i:3
[Aloop] rs1:1 rs2:5 rs3:3 i:5
[Aloop] rs1:1 rs2:6 rs3:3 i:6
[Aloop] rs1:1 rs2:7 rs3:3 i:7
[Aloop] rs1:1 rs2:8 rs3:3 i:8
[Aloop] rs1:1 rs2:9 rs3:3 i:9
[Aloop] rs1:1 rs2:10 rs3:3 i:10
[Aloop] rs1:1 rs2:11 rs3:3 i:11
[Aloop] rs1:1 rs2:12 rs3:3 i:12
[Aloop] rs1:1 rs2:13 rs3:3 i:13
[Aloop] rs1:1 rs2:14 rs3:3 i:14
[Aloop] rs1:1 rs2:15 rs3:3 i:15
[Aloop] rs1:1 rs2:16 rs3:3 i:16
[Aloop] rs1:1 rs2:17 rs3:3 i:17
[Aloop] rs1:1 rs2:18 rs3:3 i:18
[Aloop] rs1:1 rs2:19 rs3:3 i:19
[A] rs1:19 rs2:19 rs3:3
線程A的mut1解鎖
線程B的mut2解鎖
這兩個線程試圖鎖定不同的互斥鎖,因此它們無法死鎖。
盡管可以用多種不同方式想象線程死鎖,但是除非一個線程試圖獲取另一個線程持有的互斥鎖,否則不會發生帶有互斥鎖的死鎖。 (當然,還需要發生其他事情。如果發生這種情況,它將僅等待另一個線程釋放互斥量而不是死鎖。)
您的問題是資源rs2
沒有受到“保護”,因為它沒有受到單個互斥鎖的保護。 只要變量在范圍內,任何人都可以隨時訪問它。 這就是為什么要使用互斥鎖來避免兩個線程互相踩到腳趾的原因。
嘗試這個; 使用單個互斥鎖並將其命名為rs2Mutex
。 每當線程想要使用rs2
它必須鎖定rs2Mutex
且僅鎖定rs2Mutex
。 這將給您您想要的結果。
作為一般經驗法則,我總是將互斥對象的確切名稱命名為互斥對象。 這有助於避免混淆,並使您和以后的后續人員都可以更輕松地進行故障排除。 看到您進行試驗並嘗試找出問題出在哪里,這非常令人振奮。 繼續努力,並確保您了解基本原理,並且線程對於您而言將更加簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.