簡體   English   中英

互斥鎖注意是否正常工作? 不能死鎖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM