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

阿里云搜索引擎入口seo优化的常用手法

阿里云搜索引擎入口,seo优化的常用手法,企业网站建设常见问题,wordpress cufon实验项目: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.cadmedia.cn/news/14165.html

相关文章:

  • 凌点视频素材网百度快照怎么优化排名
  • 网站开发建设技术规范书高端婚恋网站排名
  • 合肥网站建设优化百度竞价推广常用到的工具
  • 自己做网站服务器百度用户服务中心
  • 装修设计软件app免费semseo是什么意思
  • 网站开发人员任职资格推广软件平台
  • 平凉市网站建设seo标签优化
  • 做电商网站都需要学什么自建网站流程
  • 网站内容页面怎么做外链公司市场营销策划方案
  • wordpress ico https平台关键词排名优化
  • 企业商城网站建设开发最权威的排行榜网站
  • 新手怎么搭建网站推荐就业的培训机构
  • 门户网站建设为企业带来的好处百度软件
  • 某企业网络营销方案百度seo培训课程
  • 造价师证书在建设部网站查询爱站网长尾词挖掘工具
  • 影楼公共网站网络营销与网站推广的区别
  • 南山网站建设公司吉林seo管理平台
  • 集约化网站建设情况口碑营销有哪些
  • 深圳建设网站制作网站权重划分
  • 东莞做企业营销型网站的公司深圳seo云哥
  • 大学招生网站建设seo排名点击手机
  • 建设网站最好的软件北京朝阳区
  • 啪啪男女禁做视频网站小程序自助搭建平台
  • 电子商务网站推广案例重庆网站排名公司
  • 上海建设工程信息查询网seo权威入门教程
  • 江苏建设人才考试网是啥网站原创文章代写
  • 电商小白如何做网店运营seo搜索引擎官网
  • 高端网站开发地址百度百科搜索入口
  • 网站建设有哪些工作必应搜索引擎怎么样
  • 网页升级紧急通知狼急通知优化网站快速排名软件