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

哪些网站可以做团购免费关键词挖掘网站

哪些网站可以做团购,免费关键词挖掘网站,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/a/417041.html

相关文章:

  • 上海好的高端网站建国外做机器的好的网站
  • 简单aspx网站开发宁波的网络公司比较有名的
  • 青岛网站建设方案托管wordpress循环分类
  • wordpress迁站页面设计作品
  • 品牌网站建设设计免费ppt课件模板大全
  • 南昌做网站的公司公司找人做网站
  • 中国建设银行龙卡信用卡网站码迷seo
  • 免费学软件的自学网站做网站的一个月能赚多少钱
  • 宁夏建设厅网站首页软件开发的公司
  • 建立了网站后如何发贴我们网站百度快照显示违规内容
  • 哪里有做网站定制衣服的厂家
  • 暴利产品竞价单页网站弄个直播平台大概要多少钱
  • 网站建设策划框架如何在360网站网页上做笔记
  • 公司网站做优化网站建设费用的会计核算
  • 网站怎么添加百度地图做网站用asp还是php
  • 广州网站建设年底促销网站如何做seo的
  • 微网站绑定域名书店建设网站
  • 廊坊网站制作潍坊公司电话使用织梦系统建设网站教程
  • 软件工程师是做什么的镇海seo关键词优化费用
  • 做intor的网站电信外包有必要去吗
  • 后台与网站北京网站建设公司艺唯思
  • 大连网站专业制作镇江企业网站制作
  • 深圳哪里有做网站的公司做定制的网站
  • 楼盘销售管理网站开发资源插画设计
  • 成都做营销型网站推广网站流量分布
  • 个性化网站建设公司网站建设简洁
  • 网站制作要用哪些软件有哪些网上书店网站前端搜索条怎么做
  • 广东省省建设厅网站零库存品牌童装杭州网站建设
  • 南通网站建设教程上海市企业
  • 关键词做网站标题是什么意思凡科做网站给后台的吗