七夕特别篇 | 浪漫的Bug

news2024/11/18 8:24:23

文章目录

  • 前言
  • 一、迷失的爱情漩涡(多线程中的错误同步)
    • 1.1 Bug 背景
    • 1.2 Bug 分析
    • 1.3 Bug 解决
  • 二、心形积分之恋(心形面积计算中的数值积分误差)
    • 1.1 Bug 背景
      • 1.1.1 背景
      • 1.1.2 数学模型
    • 1.2 Bug 分析
      • 1.2.1 初始代码
      • 1.2.2 代码工作流程图
      • 1.2.3 代码分析
    • 1.3 Bug解决
  • 三、总结
    • Bug 1: 多线程环境中的同步问题
    • Bug 2: 心形函数面积计算错误
  • 附录:心形函数代码

前言

Hello!各位C站的朋友们大家好啊!在长达 七个月 的停更后,小刘又回来了!

在这里,小刘要郑重地向大家道个歉,因为学业繁重,所以小刘没能挤出时间来写博客,让朋友们久等了!

在这里插入图片描述

如今,正值七夕佳节(好像过了,但不重要),小刘写了点儿有意思的东西请大家阅览,如果您看完后觉得还不错,那还请您别忘了留下一点儿建议或是点评哦!

一、迷失的爱情漩涡(多线程中的错误同步)

1.1 Bug 背景

假设有两个线程 ABAB 竞争访问一个共享变量 loveValue,代表两位恋人之间的爱情值。我们的目标是保证线程 AB 能够正常地交替更新这个爱情值,以模拟恋人们甜蜜的互动。

初始代码中涉及两个关键函数:increaseLovedecreaseLove,分别用于增加和减少 loveValue 值。

A loveValue increaseLove / decreaseLove A loveValue
B loveValue increaseLove / decreaseLove B loveValue
理想的程序工作流程示意图

代码如下:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex loveMutex;
int loveValue = 50;

void increaseLove(int amount) {
    std::lock_guard<std::mutex> lock(loveMutex);
    loveValue += amount;
}

void decreaseLove(int amount) {
    std::lock_guard<std::mutex> lock(loveMutex);
    loveValue -= amount;
}

int main() {
    std::thread loverA([&]() {
        for (int i = 0; i < 10; ++i) {
            increaseLove(10);
        }
    });

    std::thread loverB([&]() {
        for (int i = 0; i < 10; ++i) {
            decreaseLove(5);
        }
    });

    loverA.join();
    loverB.join();

    std::cout << "Final Love Value: " << loveValue << std::endl;

    return 0;
}

1.2 Bug 分析

尽管代码看起来似乎没有问题,但实际上却隐藏着一个隐蔽的陷阱。当线程 A 执行 increaseLove 函数时,它会锁定 loveMutex,然后更新 loveValue。但是,线程 B 试图执行 decreaseLove 函数时,由于 loveMutex 被线程 A 锁定,它将被阻塞,无法执行。反之亦然。

这就意味着线程 AB 之间的爱情互动被锁定,无法交替进行,就像陷入了一个不可逾越的障碍,无法真正地感受到彼此的情感。

A loveValue B increaseLove / decreaseLove increaseLove / decreaseLove A loveValue B
Bug 示意图

1.3 Bug 解决

解决这个问题就得用到一个更为精细的同步机制,以允许线程 AB 在不互相阻塞的情况下更新 loveValue。我们可以使用条件变量,使得线程 AB 可以在适当的时机等待和唤醒。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex loveMutex;
std::condition_variable loveCV;
int loveValue = 50;
bool isIncreasing = true;

void increaseLove(int amount) {
    std::lock_guard<std::mutex> lock(loveMutex);
    loveValue += amount;
    isIncreasing = true;
    loveCV.notify_one();
}

void decreaseLove(int amount) {
    std::unique_lock<std::mutex> lock(loveMutex);
    loveCV.wait(lock, [] { return !isIncreasing; });
    loveValue -= amount;
    isIncreasing = false;
    loveCV.notify_one();
}

int main() {
    std::thread loverA([&]() {
        for (int i = 0; i < 10; ++i) {
            increaseLove(10);
        }
    });

    std::thread loverB([&]() {
        for (int i = 0; i < 10; ++i) {
            decreaseLove(5);
        }
    });

    loverA.join();
    loverB.join();

    std::cout << "Final Love Value: " << loveValue << std::endl;

    return 0;
}

爱情有着奇妙的魔力,它使一个人为另一个人所倾倒 ——瑟伯与怀特

二、心形积分之恋(心形面积计算中的数值积分误差)

1.1 Bug 背景

1.1.1 背景

我的目的是计算心形函数面积,心形函数的参数方程可以表示为:
x = 16 ⋅ sin ⁡ 3 ( t ) , y = 13 ⋅ cos ⁡ ( t ) − 5 ⋅ cos ⁡ ( 2 t ) − 2 ⋅ cos ⁡ ( 3 t ) − cos ⁡ ( 4 t ) x = 16 \cdot \sin^3(t), \quad y = 13 \cdot \cos(t) - 5 \cdot \cos(2t) - 2 \cdot \cos(3t) - \cos(4t) x=16sin3(t),y=13cos(t)5cos(2t)2cos(3t)cos(4t)

这是

(Python绘制的函数,代码附到结尾了)

1.1.2 数学模型

我们需要计算参数方程描述的曲线的面积。这可以通过计算积分来实现,其中 t t t 的范围通常从 0 0 0 2 π 2π 2π

心形曲线的面积可以表示为如下积分:

A = 1 2 ∫ 0 2 π y ( t ) ⋅ x ′ ( t )   d t A = \frac{1}{2} \int_{0}^{2\pi} y(t) \cdot x'(t) \, dt A=2102πy(t)x(t)dt

1.2 Bug 分析

1.2.1 初始代码

代码如下:

#include <iostream>
#include <cmath>

const double pi = 3.14159265358979323846;

// 心形的参数方程
double x(double t) {
    return 16 * pow(sin(t), 3);
}

double y(double t) {
    return 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t);
}

// 使用数值积分计算面积的函数
double calculateArea(double a, double b, int n) {
    double h = (b - a) / n;
    double area = 0.0;

    for (int i = 0; i < n; ++i) {
        double x_left = x(a + i * h);
        double x_right = x(a + (i + 1) * h);
        double y_mid = (y(a + i * h) + y(a + (i + 1) * h)) / 2.0;
        area += y_mid * (x_right - x_left);
    }

    return area;
}

int main() {
    double a = 0.0;
    double b = 2 * pi;
    int n = 10000;

    double area = calculateArea(a, b, n);

    std::cout << "Heart Area: " << area << std::endl;

    return 0;
}

1.2.2 代码工作流程图

初始代码 修复后代码 计算参数方程 初始代码数值积分计算 修复后代码数值积分计算 初始代码输出结果 修复后代码输出结果 调用 调用 返回结果 返回结果 调用 调用 提供参数 提供参数 返回结果 返回结果 初始代码 修复后代码 计算参数方程 初始代码数值积分计算 修复后代码数值积分计算 初始代码输出结果 修复后代码输出结果
理想的代码工作流程图

1.2.3 代码分析

当我们考虑使用矩形法进行数值积分时,我们希望通过将积分区间划分为多个小矩形,对每个小矩形的面积进行累加来逼近曲线所围成的区域面积。在这个 Bug 中,我们的目标是计算心形曲线所包围的区域面积,然而,由于在计算面积时忽略了 x ′ ( t ) x′(t) x(t),导致了错误的结果。

在原始代码中,我们使用了一个简单的循环来遍历积分区间的小段,每个小段的左右边界分别对应函数 x ( t ) x(t) x(t) 的值。我们计算了每个小段中心点的 y 值(即 ( y ( a + i ⋅ h ) + y ( a + ( i + 1 ) ⋅ h ) ) / 2.0 (y(a+i⋅h)+y(a+(i+1)⋅h))/2.0 (y(a+ih)+y(a+(i+1)h))/2.0 ),然后将其乘以区间长度 h h h,最终累加得到近似的区域面积。但在这个过程中,我们遗漏了一个重要的细节:每个小段的宽度(即 h h h)应该乘以 x ′ ( t ) x′(t) x(t) 才能得到正确的面积。

在数学上,当我们计算曲线上一点的切线斜率,即导数,我们可以通过求解 x ( t ) x(t) x(t) 的导数来得到 x ′ ( t ) x′(t) x(t)。因此,在计算每个小段的面积时,我们应该使用 x ′ ( t ) x′(t) x(t) 乘以 h h h 而不仅仅是 h h h,以更精确地逼近曲线围成的区域。

1.3 Bug解决

当运行初始的错误代码时,我们会得到一个错误的心形区域面积。这是因为在计算面积时,我们忽略了 x ′ ( t ) x′(t) x(t) 这个重要因素,导致积分的结果与真实面积相差较大。

假设我们使用以下的参数来运行初始错误代码:

double a = 0.0;
double b = 2 * pi;
int n = 10000;

运行后,输出的心形区域面积可能会是:

Heart Area: 31.4159

实际上,正确的心形区域面积应该接近 82.743 82.743 82.743,这恰恰是因为积分计算没有考虑到参数方程的导数 x ′ ( t ) x′(t) x(t)。为了修复这个问题,我们需要在计算面积时乘以 x ′ ( t ) x′(t) x(t)

// 使用数值积分计算面积的函数
double calculateArea(double a, double b, int n) {
    double h = (b - a) / n;
    double area = 0.0;

    for (int i = 0; i < n; ++i) {
        double t = a + i * h;
        double x_left = x(t);
        double x_right = x(t + h);
        double y_mid = (y(t) + y(t + h)) / 2.0;
        area += y_mid * (x_right - x_left);
    }

    return area;
}

在修正后的代码中,我们将 x ( t ) x(t) x(t) x ( t + h ) x(t+h) x(t+h) 分别作为小区间的左边界和右边界,并使用中点的 y y y 值乘以小区间的宽度来计算近似的面积。这个修正考虑了 x ′ ( t ) x′(t) x(t) 的影响,使得程序能够更准确地计算心形曲线所围成的区域面积。

三、总结

Bug 1: 多线程环境中的同步问题

这个Bug发生在一个涉及多线程的环境中。通过竞争访问一个共享变量,在代码中模拟了两位恋人之间的爱情值互动。尽管看起来没有问题,但实际上由于同步机制的缺失,线程 A 和 B 之间的爱情互动被锁定,无法正常交替进行,导致无法真实感受到彼此的情感。通过重新设计同步机制,我们解决了这个问题,使得线程 A 和 B 能够在不互相阻塞的情况下更新爱情值,实现了恋人之间情感的自由流动。

Bug 2: 心形函数面积计算错误

这个Bug涉及到计算心形函数所围成的区域面积。初始代码使用矩形法计算数值积分来近似区域面积,但在计算过程中忽略了心形曲线的导数。因此,计算得到的区域面积并不准确。通过引入导数修正,我们重新计算每个小段的面积,考虑了函数的变化率,从而得到了更精确的区域面积。这个修复展示了数学模型与代码之间的相互作用,揭示了在复杂问题中精确建模的重要性。

附录:心形函数代码

import numpy as np
import matplotlib.pyplot as plt

# 心形的参数方程
def x(t):
    return 16 * np.sin(t)**3

def y(t):
    return 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

# 生成从0到2*pi对应的t值
t_values = np.linspace(0, 2*np.pi, 1000)

# 计算相应的x和y值
x_values = x(t_values)
y_values = y(t_values)

# 绘制心形
plt.figure(figsize=(6, 6))
plt.plot(x_values, y_values, color='red')
plt.title('Heart Shape Function')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.axis('equal')  # x轴和y轴的相等纵横比
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/928486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 - 字符串筛选排序 - 数组(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

性能测试告诉你 mysql 数据库存储引擎该如何选?

简介 数据库存储引擎&#xff1a;是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以…

辛苦拍摄的视频画面有多个杂物,教你一分钟快速去除

短视频在我们生活中已经成为了人们记录生活、分享生活的重要方式之一。然而&#xff0c;在我们辛苦拍摄的同时难免也会遇到拍摄画面中出现杂物、多余的物体或者是不相干的对象的问题。想要无痕去除的话&#xff0c;随着人工智能的快速发展&#xff0c;AI智能抠像技术为解决这一…

【C语言】16-函数-2

1. 函数的嵌套调用 C 语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中又调用另一个函数,如下图所示: 其执行的流程为: 执行 main 函数的开头部分遇函数调用语句…

Hbase--技术文档--单机docker基础安装(非高可用)

环境准备-docker 配置Linux服务器华为云耀云服务器之docker安装&#xff0c;以及环境变量安装 java &#xff08;虚拟机一样适用&#xff09;_docker配置java环境变量_一单成的博客-CSDN博客 说明&#xff1a; 本文章安装方式为学习使用的单体hbase项目。主要是学习&#xff…

C++day5(运算符重载)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.自增运算符重载 #include <iostream>using namespace std;class Person {// friend const Person operator(const Person &L, const Person &R); private:int a;int b; public://无参构造函数Perso…

扩散模型实战(六):Diffusers DDPM初探

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xf…

《Zookeeper》源码分析(二十一)之 客户端启动过程

目录 ZooKeeperMain数据结构初始化启动1. 解析启动参数MyCommandOptions数据结构构造参数 parseOptions() 2. 创建客户端实例3. 处理客户端命令1.解析命令字符串2. 处理命令 ZooKeeperMain 客户端的启动类为ZooKeeperMain 数据结构 commandMap&#xff1a;存放zookeeper支持的…

什么是住宅ip,静态和动态怎么选?

上文我们介绍了数据中心代理&#xff0c;这次我们来介绍下住宅代理ip&#xff0c;住宅代理ip分类两种类型&#xff1a;静态住宅代理和动态住宅代理&#xff0c;他们有什么区别又能用在什么场景呢&#xff1f;我们先从他们是如何运作开始。 一、什么是住宅代理ip isp住宅代理i…

GPIO口输出-点亮LED灯

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…

大二总结,记录下自己的收获。

一&#xff1a;从大一到大二结束每个学期的学习时间 二&#xff1a;成长历程 三&#xff1a;学习知识 3.1&#xff1a;大一学习知识 3.1&#xff1a;大二学习知识 四&#xff1a;接下来的路 学习时间…

IT运维软件的费用是多少?

正常一套IT运维软件费用一般在5千-50万之间不等&#xff0c;而且分为一次性付费或年付费模式&#xff0c;付费方式导致的价格也不同。 正常情况下IT运维软件的具体价格&#xff0c;是需要根据企业的实际需求来进行综合评估&#xff0c;一般来说&#xff0c;影响具体价格费用有以…

【每日易题】数组下标的逆天用法——你见过把数组存储的值当作数组下标来解题的吗?

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;在最近是刷题中&#xff0c;遇到了一种非常新奇的数组下标的用法&#xff0c;今天想来给大家分享一下这种神奇的思路和方法&#xff0c;希望能在你遇到类似问题时能通…

《剑指Offer》模块4 栈和队列

栈和队列 1. 用两个栈实现队列 原题链接 补充&#xff1a;copy(a,b) 把a赋值给b class MyQueue { public:/** Initialize your data structure here. */stack<int> stk, cache;MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stk.push(x)…

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释&#xff1a; 分布式&#xff1a;把一个囊肿的系统分成无数个单独可运行的功能模块 集群&#xff1a; 把相同的项目复制进行多次部署&#xff08;可以是一台服务器多次部署&#xff0c;例如使用8080部署一个&#xff0c;8081部署一个&#xff0c…

vue拖拽div盒子实现上下拖动互换

vue拖拽div盒子实现上下拖动互换 <div v-for"(item, index) in formList" :key"index" draggable"true"dragstart"handleDragStart($event, item)"dragenter"handleDragEnter($event, item)"dragover.prevent"han…

如何在vscode导入下载的插件安装包

点击vscode插件 --> 点击3个点 --> 选择从VSIX安装 点击更新报 Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to m…

清吧全面解析,从此不再困惑

清吧&#xff08;Bar&#xff09;也叫休闲酒吧&#xff0c;是以轻音乐为主、比较安静的酒吧&#xff0c;比较适合和朋友一起谈天说地、喝酒聊天。清吧的装修风格偏向营造氛围&#xff0c;不如其他酒吧炫目。通常清吧这一类的酒吧不提供食品&#xff0c;仅提供酒水和饮料。通常清…

性价比神机!南卡新品OE CC开放式耳机上线,彻底把门焊死了!

开放式耳机,作为今年大热的产品,以其高舒适性在蓝牙耳机市场大放异彩,但是同时用户也反应出存在音质不足、漏音、通话质量差等多项问题&#xff0c;最重要的还是成熟的开放式产品价格偏贵&#xff0c;导致入门门槛相对较高。针对这些问题,开放式音频专业品牌南卡则是以产品力革…

keepalive+haproxy实现高可用

1&#xff0c;两台主机安装keepalived 配置keepalived 安装haproxy make PREFIX/usr/local/haproxy TARGETlinux2628 make install PREFIX/usr/local/haproxy 创建配置文件 配置haproxy vim /etc/haproxy/haproxy.cfg 添加为系统服务 cp /root/haproxy-1.7.2/examples/hapro…