如何用C++写一个死锁

news/2024/7/8 1:39:57 标签: c++, 开发语言

死锁就是多个进程或者线程竞争临界资源所造成的僵局

最简单的死锁,线程x持有资源a请求资源b,线程y持有资源b请求资源a,死锁了

设置两个全局变量当作线程共享资源,为了让两个线程分别持有一个资源让它们抢到一个资源后睡一会让另一个抢

#include<iostream>
#include<ctime>
#include<chrono>
#include<thread>
int a = 1, b = 1;

void x() {
    while (true) {
        if (a > 0) {
            --a;
            break;
        }
    }
    std::this_thread::sleep_for(std::chrono::seconds(1));
    while (true) {
        if (b > 0) {
            --b;
            break;
        }
    }
    ++a;
    ++b;
}

void y() {
    while (true) {
        if (b > 0) {
            --b;
            break;
        }
    }
    std::this_thread::sleep_for(std::chrono::seconds(1));
    while (true) {
        if (a > 0) {
            --a;
            break;
        }
    }
    ++b;
    ++a;
}

int main() {
    std::thread tx(x);
    std::thread ty(y);
    tx.join();
    ty.join();
}

等同于这个代码,刚刚的代码相当于实现了一个自旋锁,下面这个是互斥锁

#include<iostream>
#include<ctime>
#include<chrono>
#include<thread>
std::mutex a;
std::mutex b;

void x() {
    a.lock();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    b.lock();
    a.unlock();
    b.unlock();
}

void y() {
    b.lock();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    a.lock();
    a.unlock();
    b.unlock();
}

int main() {
    std::thread tx(x);
    std::thread ty(y);
    tx.join();
    ty.join();
}

只需要把它们请求资源的顺序改成相同就不会死锁了


http://www.niftyadmin.cn/n/5535995.html

相关文章

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

【D3.js in Action 3 精译】1.2.3 Canvas 与 WebGL + 1.2.4 CSS

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL ✔️1.2.4 CSS ✔️1.2.5 JavaScript&#xff08;精译中 ⏳&#xff09;1.2.6 Node …

C语言学习笔记--第一个程序

第一个C语言程序 #include<stdio.h> //引用输入输出头文件&#xff0c;每一次都需要引用这个文件 //.h是头文件 // .c是源文件 // .cpp是C源文件&#xff0c;兼容C //C的第一个程序 // 行注释&#xff08;只能注释这一行&#xff09; /*块注释 */ int main() {printf(&…

第3章.中央服务器的物联网模式--规则引擎

规则引擎 规则引擎本质上是物联网事件和需要与这些事件相关联的动作之间的映射。在物联网环境中&#xff0c;事件通常使用传感器生成&#xff0c;所需的动作由执行器采取。本书中用于该图案的符号如下图所示&#xff1a; 图3.6–“规则引擎”模式的符号 一个有趣的类比是将规则…

Vuetify3:监听当前手机还是电脑

我们在开发的时候&#xff0c;实现根据移动设备或PC设备来改编一些交互样式&#xff0c;这个时候我们需要监听宽度&#xff0c;在Vuetify3中可我们可以参考 ​​​​显示 & 平台配合监听即可在窗口缩小的时候判断出手机还是电脑 <template><v-app><div v-if…

航空数据管控系统-①项目准备阶段:任务2:项目技术预研(技术架构)

任务描述 掌握项目的总体功能&#xff0c;及实现流程。预习项目中所使用到的技术和知识点。 任务指导 一、项目效果展示 图1-数据统计大屏页面 图2-航空实时监控页面 二、项目架构 1、总体架构&#xff1a; 2、技术架构 技术清单&#xff1a; 功能 组件 说明 消息中间件…

Java Stream API 常用操作技巧

Java 8 引入的 Stream API 为集合操作提供了一种声明式编程模型&#xff0c;极大地简化了数据处理的复杂性。本文将介绍 Java Stream API 的几种常用操作方式&#xff0c;帮助开发者更高效地处理集合数据。 1. 过滤&#xff08;Filtering&#xff09; 过滤是选择集合中满足特…

jvm 03 JVM的运行时数据区域 ,(类常量池,运行时常量池,字符串常量池这个三个的区别),操作系统内存模型JMM和JVM的内存模型联系

方法区在jdk8后&#xff0c;改成元空间 JVM内存模型&#xff1a; JMM 主内存&#xff1a;本地方法区和堆 工作内存&#xff1a;私有的工作栈 其实一个JVM内存模型&#xff08;主要就是运行时数据区域&#xff09;一个Java进程的JMM&#xff0c;工作内存JVM中线程的内存区域…