互斥锁是否正常工作?不能死锁

时间:2017-04-07 19:04:56

标签: c++ multithreading mutex deadlock

所以我正在尝试制作一个应该死锁的C ++程序。使用我的以下代码,我相信它应该可以工作,但不会死锁。要么我的mutex.lock()不能正常工作?我的意思是如果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解锁

2 个答案:

答案 0 :(得分:1)

两个线程试图锁定不同的互斥锁,因此它们无法解决死锁问题。

虽然有许多不同的方法可以想象线程死锁,但是除非一个线程试图获取另一个线程持有的互斥锁,否则不会发生使用互斥锁的死锁。 (当然,其他事情也需要发生。如果发生这种情况,它只会等待另一个线程释放互斥锁而不是死锁。)

答案 1 :(得分:-1)

您的问题是资源rs2未被保护&#34;因为它不受单个互斥锁的保护。任何人都可以随时访问变量,只要它在范围内即可。这就是为什么你使用互斥锁来避免两个线程踩到彼此的脚趾。

试试这个;使用单个互斥锁并将其命名为rs2Mutex。每当线程想要使用rs2时,它必须锁定rs2Mutex且仅rs2Mutex。这将为您提供所需的结果。

作为一般经验法则,我总是将我的互斥锁命名为它们要保护的内容。这有助于避免混淆,并使您和稍后跟随您的人更容易进行故障排除。看到你试验并试图找出出错的地方,真是令人振奋。继续努力,确保你理解基本原则,在未来的路上,线程会更加简单。