当前位置: 首页 > wzjs >正文

内蒙古城乡和建设厅网站wordpress 正在建设插件

内蒙古城乡和建设厅网站,wordpress 正在建设插件,浙江建设厅官网证件查询,个人如何推广app实验项目:C 多线程中的数据竞争与同步机制 实验要求: 1. 编写基础代码:模拟账户余额取款 创建一个全局共享变量 int balance 100,表示初始余额; 创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元&a…

实验项目:C++ 多线程中的数据竞争与同步机制

实验要求:

1. 编写基础代码:模拟账户余额取款

创建一个全局共享变量 int balance = 100,表示初始余额;

创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元;

不使用任何同步机制,观察两个线程是否可能都成功取款(产生负余额);

输出每个线程的操作过程和最终余额。

2. 引入 std::atomic<int> 实现原子性控制

使用 std::atomic<int> 声明余额变量balance;

使用 compare_exchange_weak 实现原子性“读取余额并扣款”的逻辑;

再次运行程序,观察是否仍然出现竞争问题。

3. 使用 std::mutex 锁住临界区

改用普通变量 int balance,但在关键操作处加锁(std::lock_guard<std::mutex> lock(mtx);),确保线程间互斥

再次运行程序,观察是否仍然出现竞争问题。

4. 总结以上三种方式的优缺点

实验步骤、实验结果及结果分析:

1. 编写基础代码:模拟账户余额取款

创建一个全局共享变量 int balance = 100,表示初始余额;

创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元;

不使用任何同步机制,观察两个线程是否可能都成功取款(产生负余额);

输出每个线程的操作过程和最终余额。

创建一个全局共享变量 int balance = 100,表示初始余额;

int balance = 100; // 全局共享变量

创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元;

    std::thread thread_a(withdraw, "Thread A", 100);std::thread thread_b(withdraw, "Thread B", 100);

不使用任何同步机制,观察两个线程是否可能都成功取款(产生负余额);

输出每个线程的操作过程和最终余额。

#include <iostream>   
#include <thread>   
#include <chrono>int balance = 100; // 全局共享变量void withdraw(const std::string& thread_name, int amount) {if (balance >= amount) {std::cout << thread_name << ": 当前余额 " << balance << " 元,尝试取款 " << amount << " 元\n";balance -= amount;std::cout << thread_name << ": 取款成功,新余额 " << balance << " 元\n";} else {std::cout << thread_name << ": 余额不足,取款失败\n";}   
}int main() {std::cout << "初始余额: " << balance << " 元\n";std::thread thread_a(withdraw, "Thread A", 100);std::thread thread_b(withdraw, "Thread B", 100);thread_a.join();thread_b.join();std::cout << "最终余额: " << balance << " 元\n";return 0;   
}

编译多线程程序时链接 pthread 库 :

g++ 1.cpp -o 1 -pthread

竞争条件导致负余额: 

 


 

2. 引入 std::atomic<int> 实现原子性控制

使用 std::atomic<int> 声明余额变量balance;

使用 compare_exchange_weak 实现原子性“读取余额并扣款”的逻辑;

再次运行程序,观察是否仍然出现竞争问题。

std::atomic<int> balance(100); // 原子变量void withdraw(const std::string& thread_name, int amount) {int expected = balance.load();while (expected >= amount && !balance.compare_exchange_weak(expected, expected - amount)) {}if (expected >= amount) {std::cout << thread_name << ": 取款成功,新余额 " << balance.load() << " 元\n";} else {std::cout << thread_name << ": 余额不足,取款失败\n";}   
}

 

3. 使用 std::mutex 锁住临界区

改用普通变量 int balance,但在关键操作处加锁(std::lock_guard<std::mutex> lock(mtx);),确保线程间互斥

再次运行程序,观察是否仍然出现竞争问题。

int balance = 100; // 普通变量   
std::mutex mtx;     // 互斥锁void withdraw(const std::string& thread_name, int amount) {std::lock_guard<std::mutex> lock(mtx); // 自动加锁解锁if (balance >= amount) {balance -= amount;std::cout << thread_name << ": 取款成功,新余额 " << balance << " 元\n";} else {std::cout << thread_name << ": 余额不足,取款失败\n";}   
}

 

 4. 总结以上三种方式的优缺点

  1. 无同步机制的问题

    • 两个线程可能同时读取到余额为100
    • 都认为可以取款,导致最终余额为-100
    • 这是典型的竞争条件。
  2. atomic解决方案

    • compare_exchange_weak会在原子操作中比较并交换值

    • 如果其他线程修改了值,操作会失败并重试
  3. mutex解决方案

    • 使用锁确保同一时间只有一个线程能访问临界区
    • lock_guard在构造时加锁,析构时自动解锁
http://www.dtcms.com/wzjs/802041.html

相关文章:

  • 做百度关键词网站赣州建设培训网
  • 美食网站功能建设网站流量统计分析的维度包括
  • 政务门户网站建设信息今天株洲最新消息
  • 微网站建设价格烟台市科技局网站
  • 网站建设启凡必应网站首页的图片怎么做的
  • 做网站要会那些ps医院网站asp源码
  • 金堂企业网站建设免费 搭建公司网站
  • 自己做的网站怎么让别人看见阿里巴巴网站建设教程视频
  • 企业搭建一个营销型网站多少钱网站建设实验报告总结
  • 网站报301错误网页开发基础实验总结
  • 天津品牌网站设计wordpress字段关联
  • 贵阳市城乡建设学校网站做网站商城需要什么软件
  • 物流网站建设模板下载网站建设 甘肃
  • 想开网站建设公司服装设计好找工作吗
  • 可做网站的免费空间吉林网络公司网站建设
  • 创可贴设计网站官网无锡
  • 网站下载免费软件wordpress 访客记录
  • ai做图标教程网站彩票网站代理怎么做
  • 深圳专业网站建设公司好吗asp网站安全
  • 北京html5网站建设互联网+项目计划书范文案例
  • 内网门户网站建设要求电子商务网站建设 大纲
  • 杭州市网站制作苏州高新区核酸检测
  • 企业建设网站网站建设公司中国住房城乡建设部官方网站
  • wordpress 被挂班级优化大师免费下载电脑版
  • 网站项目需要什么公众号 wordpress
  • 如何自己弄网站apache wordpress 伪静态规则
  • 检察院加强网站建设网页设计基础成果介绍
  • 制作网页的的网站做苗木网站
  • 提高网站访问量开锁做网站怎么样
  • 上海优化排名网站营销型网站的设计框架