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

网站建设基础html静态页面

网站建设基础,html静态页面,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/813974.html

相关文章:

  • 招投标中网站建设评分标准wordpress xmlrpc漏洞
  • 网站建设排行阿里云网站托管
  • 云霄县建设局网站投诉深圳网站建设q双赢世讯
  • 一分钟建设网站南宁网站建设哪家公司好
  • 网络优化工程师工资seo自然排名优化
  • 河南省省建设厅网站如何生成网址链接
  • 济宁网站建设推荐海外医疗手机网站建设
  • 中国空间站距离地面多少公里重庆建设工程信息网下载
  • 单位建设网站申请福鼎网页设计
  • 怎么增加网站浏览量不懂的人做网站用织梦 还是 cms
  • 徐州网站无障碍建设网站建设需求分析流程图
  • 我的世界做皮肤的网站wordpress调用留言板
  • 外贸网站有哪些?天津seo优化公司
  • 英铭网站建设网站建设教程搭建芽嘱湖南岚鸿信赖
  • 网站内部优化方法常见网站架构
  • 潍坊专业网站建设哪家好wordpress首页js怎么添加图片
  • 公司做网站之前要准备什么网站200m虚拟主机能放多少东西
  • 网站集约化建设的目的内蒙网站建设seo优化
  • 旅游网站首页设计大概图东莞专业网站设计专业服务
  • 浙江网站建设品牌设计360社区app
  • 西宁高端网站开发公司网站图片切换效果
  • 官方网站建设 就问磐石网络专业沧州英文网站制作
  • 会计公司网站源码福州网站制作
  • 广州海珠做网站实用网站的设计与实现
  • 常州网站制作网站服务器失去响应怎么解决
  • 白城市住房建设局网站公司网站建设推合同
  • 淮安网站建设多少钱百度搜索公司网站展现图片
  • 网站营销体系的建设及运营情况中山平面设计公司
  • 搭一个网站网站设计素材网站
  • 有云服务器怎么做网站装修设计在线