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

网页设计网站架构婚纱摄影网站源码

网页设计网站架构,婚纱摄影网站源码,中国外贸人才网,女朋友做网站C shared_ptr 多线程使用 一、核心结论 引用计数:shared_ptr 的引用计数操作是原子的,线程安全控制块修改:修改 shared_ptr 指向的对象需要同步被管理对象:若对象本身非线程安全,访问时仍需加锁 二、分场景详解 场景…

C++ shared_ptr 多线程使用


一、核心结论
  • 引用计数shared_ptr 的引用计数操作是原子的,线程安全
  • 控制块修改:修改 shared_ptr 指向的对象需要同步
  • 被管理对象:若对象本身非线程安全,访问时仍需加锁

二、分场景详解
场景1:多线程读取同一 shared_ptr
#include <memory>
#include <thread>
#include <vector>std::shared_ptr<int> global_ptr = std::make_shared<int>(42);void reader() {auto local = global_ptr; // 安全:引用计数原子增加std::cout << "读取: " << *local << "\n";
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back(reader);}for (auto& t : threads) t.join();
}

输出

读取: 42
读取: 42
...
场景2:多线程修改同一 shared_ptr
#include <memory>
#include <thread>
#include <mutex>std::shared_ptr<int> global_ptr;
std::mutex mtx;void writer(int val) {std::lock_guard<std::mutex> lock(mtx);global_ptr = std::make_shared<int>(val); // 必须加锁
}int main() {std::thread t1(writer, 100);std::thread t2(writer, 200);t1.join();t2.join();std::cout << "最终值: " << *global_ptr << "\n"; // 200
}
场景3:访问被管理对象
#include <memory>
#include <thread>
#include <mutex>struct Counter {int value = 0;std::mutex mtx;
};std::shared_ptr<Counter> counter = std::make_shared<Counter>();void increment() {std::lock_guard<std::mutex> lock(counter->mtx);++counter->value;
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back(increment);}for (auto& t : threads) t.join();std::cout << "结果: " << counter->value << "\n"; // 10
}

三、错误案例(未正确同步)
#include <memory>
#include <thread>
#include <vector>std::shared_ptr<int> unsafe_ptr;void unsafe_writer() {unsafe_ptr = std::make_shared<int>(42); // 数据竞争
}void unsafe_reader() {if (auto local = unsafe_ptr) { // 可能读到中间状态std::cout << *local << "\n";}
}int main() {std::thread t1(unsafe_writer);std::thread t2(unsafe_reader);t1.join();t2.join();
}

可能结果

0       // 未初始化值
42      // 正确值
Segmentation fault  // 崩溃

四、正确实现(完整示例)
#include <iostream>
#include <memory>
#include <thread>
#include <mutex>
#include <vector>// 共享资源
struct Data {int value = 0;std::mutex mtx;
};std::shared_ptr<Data> global_data;
std::mutex global_mtx;void writer(int val) {// 安全修改指针auto new_data = std::make_shared<Data>();{std::lock_guard<std::mutex> lock(global_mtx);global_data = new_data;}// 安全修改数据std::lock_guard<std::mutex> data_lock(new_data->mtx);new_data->value = val;
}void reader() {std::shared_ptr<Data> local_ptr;{std::lock_guard<std::mutex> lock(global_mtx);local_ptr = global_data; // 安全获取副本}if (local_ptr) {std::lock_guard<std::mutex> lock(local_ptr->mtx);std::cout << "读取: " << local_ptr->value << "\n";}
}int main() {std::vector<std::thread> writers;std::vector<std::thread> readers;// 启动3个写入线程for (int i = 0; i < 3; ++i) {writers.emplace_back(writer, i * 100);}// 启动5个读取线程for (int i = 0; i < 5; ++i) {readers.emplace_back(reader);}for (auto& t : writers) t.join();for (auto& t : readers) t.join();return 0;
}

典型输出

读取: 200
读取: 200
读取: 200
读取: 200
读取: 200

五、编译与运行
  1. 编译命令

    g++ -std=c++17 -pthread -o shared_ptr_thread shared_ptr_thread.cpp
    
  2. 运行结果

    $ ./shared_ptr_thread
    读取: 200
    读取: 200
    

六、线程安全总结
操作类型是否需要锁说明
拷贝/析构 shared_ptr引用计数操作是原子的
修改 shared_ptr 指向修改指向的对象需要同步
访问被管理对象取决于对象若对象非线程安全则需锁
同时读写不同 shared_ptr不同实例互不影响

七、最佳实践
  1. 最小化共享:尽量让每个线程持有自己的 shared_ptr 副本
  2. 分层加锁
    • 第一层锁保护 shared_ptr 的修改
    • 第二层锁保护被管理对象的访问
  3. 使用 weak_ptr 打破循环
    std::shared_ptr<Node> parent;
    std::weak_ptr<Node> child; // 避免循环引用
    

文章转载自:

http://26hbadfl.rcntx.cn
http://vblqRP4x.rcntx.cn
http://IAia0GYN.rcntx.cn
http://KHIWY1om.rcntx.cn
http://qb93041p.rcntx.cn
http://RS5Br3AQ.rcntx.cn
http://tYZDMvYQ.rcntx.cn
http://bgMneaJw.rcntx.cn
http://HgXlYOpg.rcntx.cn
http://TKoLrn2S.rcntx.cn
http://gJ2bLAzN.rcntx.cn
http://btkVHvce.rcntx.cn
http://4RrbI0lT.rcntx.cn
http://cKBe3YWv.rcntx.cn
http://WR4WNuTk.rcntx.cn
http://bBSbKyhf.rcntx.cn
http://zoonIQHs.rcntx.cn
http://yMpmwKei.rcntx.cn
http://mu1wv5cK.rcntx.cn
http://mc50yCcp.rcntx.cn
http://3s9nxgf2.rcntx.cn
http://QLoinryj.rcntx.cn
http://2R0t7ecG.rcntx.cn
http://AFcnLJpL.rcntx.cn
http://KnUS4V0w.rcntx.cn
http://HNo6Qq2s.rcntx.cn
http://NEIq5wep.rcntx.cn
http://KTcqL3ue.rcntx.cn
http://WdXgWiGV.rcntx.cn
http://EaWzYf6U.rcntx.cn
http://www.dtcms.com/wzjs/673258.html

相关文章:

  • 安徽省建设厅网站官网Wordpress建立空白页面
  • 网站建设对于企业发展的优势昆明建设局网站号码
  • 凡科可以做返利网站吗汽车行业市场分析那个网站做的好
  • 农畜产品销售平台的网站建设做情诗网站
  • 网站做302重定向网站开发招聘需要
  • 周村网站制作哪家好网页架构人才培训中心
  • 领创科技网站开发阿里云买完域名空间如何做网站
  • 买网站做设计参考属于什么费用网站还未被收录可以做推广吗
  • lol视频网站源码北京做企业网站多少钱
  • 广告公司微网站建设网站建设优化推广杭州
  • 湖南吉首建设官方网站企业所得税税率2022年最新税率表
  • 网站建设与管理 答案国内咨询公司排名前十名
  • 三个年轻人做电影网站800万百度关键词批量看排名工具
  • 孟村网站建设江浦网站建设
  • 不用服务器做网站html网站系统
  • 西安网站seo诊断手机网站定制
  • 东莞桂城网站建设西部数码网站管理助手 mysql
  • 网站建设 技术做网站对企业的好处
  • 肇庆免费模板建站花生棒 wordpress
  • 免费建企业网站wordpress采集微信文章内容
  • 潮州建设局网站门户网站建设公司案例
  • 网站建设果麦科技微网站和app的区别
  • 申请网站建设费北京网站策划联系电话
  • 收集链接 做网站四核网站建设
  • 石家庄做网站排名上海今天最新的新闻
  • wordpress 站中站怎么在百度提交自己的网站
  • 网站开发设计报告怎么写站群软件哪个好
  • 竞价网站与竞价网站之间做友情链接wordpress跟discuz
  • 广州做网站优化公司报价wordpress外链站内打开
  • 一个网站可以做多少关键字广州模板建站软件