首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >互斥锁便条正常工作吗?不能死锁

互斥锁便条正常工作吗?不能死锁
EN

Stack Overflow用户
提问于 2017-04-07 19:04:56
回答 2查看 170关注 0票数 0

因此,我试图创建一个应该死锁的C++程序。使用下面的代码,我认为它应该可以工作,但不会死锁。要么我的mutex.lock()不能正常工作?我的意思是如果mu2.lock()锁定了应该解锁的关键部分,那么它就应该解锁,这意味着funcA不应该运行,或者至少要等到mu2解锁,因为它们都使用了资源rs2?为什么我不能锁定程序呢?

代码语言:javascript
复制
#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锁 Brs3: 3 rs1: 1 rs2: 99 线程A的mut1锁 Alooprs1: 1 rs2: 0 rs3: 3 i:0 Alooprs1: 1 rs2: 1 rs3: 3 i:1 Alooprs1: 1 rs2: 2 rs3: 3 i:2 Alooprs1: 1 rs2: 3 rs3: 3 i:3 Alooprs1: 1 rs2: 5 rs3: 3 i:5 Alooprs1: 1 rs2: 6 rs3: 3 i:6 Alooprs1: 1 rs2: 7 rs3: 3 i:7 Alooprs1: 1 rs2: 8 rs3: 3 i:8 Alooprs1: 1 rs2: 9 rs3: 3 i:9 Alooprs1: 1 rs2: 10 rs3: 3 i:10 Alooprs1: 1 rs2: 11 rs3: 3 i:11 Alooprs1: 1 rs2: 12 rs3: 3 i:12 Alooprs1: 1 rs2: 13 rs3: 3 i:13 Alooprs1: 1 rs2: 14 rs3: 3 i:14 Alooprs1: 1 rs2: 15 rs3: 3 i:15 Alooprs1: 1 rs2: 16 rs3: 3 i:16 Alooprs1: 1 rs2: 17 rs3: 3 i:17 Alooprs1: 1 rs2: 18 rs3: 3 i:18 Alooprs1: 1 rs2: 19 rs3: 3 i:19 Ars1: 19 rs2: 19 rs3: 3 线程A的mut1解锁 线程B的mut2解锁

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-07 19:07:48

这两个线程试图锁定不同的互斥对象,因此它们不可能死锁。

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-07 19:20:24

您的问题是,资源rs2没有受到“保护”,因为它没有受到单个互斥对象的保护。只要变量在范围内,任何人都可以在任何时候访问它。这就是为什么您使用互斥锁来避免两个线程踩在彼此的脚趾上。

试试这个;使用单个互斥对象,并将其命名为rs2Mutex。每当线程想要使用rs2时,它都必须锁定rs2Mutex,并且只锁定rs2Mutex。这会给你带来你想要的结果。

作为一个普遍的经验法则,我总是命名我的互斥物,确切地说他们将保护什么。这有助于避免混淆,并使您和后续人员更容易进行故障排除。看到你尝试并试图找出问题出在哪里,这是非常振奋人心的。继续做下去,确保你理解了基本原则,这样你的工作就会简单得多。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43285400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档