多线程程序设计(二)——Immutable

news/2025/3/13 14:56:05/文章来源:https://www.cnblogs.com/green-cnblogs/p/18752329

本文摘要了《Java多线程设计模式》一书中提及的 Immutable 模式的适用场景,并针对书中例子(若干名称有微调)给出一份 C++ 参考实现及其 UML 逻辑图,也列出与之相关的模式。

◆ 适用场景

多个线程在同时访问共享数据时,只需要读取数据而不必修改数据。

◆ 解决方案

无需使用锁机制,也不提供修改共享数据的应用程序接口(API)。

◆ 参考实现

例子模拟 3 个打印机不停地打印人的信息。

class Person
{...stringget_name(){...}stringget_address(){...}friendstd::ostream &operator<<(std::ostream & os, Person const& person){...}};

Person 是一个 Immutable 类,没有使用锁机制,也不提供修改其中内容的接口。

class Printer
{...Person const&__person__;...voidrun()                      #1{while (true)                #2cout << __name__ << "(" << std::this_thread::get_id() << ") prints " << __person__ << endl;}};...int
main(int argc, char * argv[])
{...Person alice("Alice", "Alaska");Printer p1("Printer1", alice);Printer p2("Printer2", alice);Printer p3("Printer3", alice);thread t1(&Printer::run, &p1);thread t2(&Printer::run, &p2);              #3thread t3(&Printer::run, &p3);t1.join();t2.join();                  #4t3.join();...
}

Printer::run() 作为线程的初始函数(#1),模拟打印机不停地打印人的信息(#2)。在主线程中启动这 3 个打印机子线程(#3)后,等待子线程完成(#4)。

以下类图展现了代码主要逻辑结构,

class

以下顺序图展现了线程间的并发中的交互。

sequence

◆ 验证测试

笔者在实验环境一中编译代码(-std=c++11)成功后运行可执行文件,

$ g++ -std=c++11 -lpthread immutable.cpp 
$ ./a.out

运行结果如下:

Printer1(1992647760) prints [ Person: name = Alice, address = Alaska ]
Printer3(1975862352) prints [ Person: name = Alice, address = Alaska ]
Printer2(1984255056) prints [ Person: name = Alice, address = Alaska ]
Printer2(1984255056) prints [ Person: name = Alice, address = Alaska ]
Printer2(1984255056) prints [ Person: name = Alice, address = Alaska ]
Printer3(1975862352) prints [ Person: name = Alice, address = Alaska ]
Printer1(1992647760) prints [ Person: name = Alice, address = Alaska ]
Printer2(1984255056) prints [ Person: name = Alice, address = Alaska ]
...

◆ 相关模式

  • 对多个线程进行共享互斥,可以使用 Single Threaded Execution 模式。
  • 想要分离“读”线程和“读”线程,可以使用 Read-Write Lock 模式。

◆ 最后

完整的代码请参考 [gitee] cnblogs/18752329 。

致《Java多线程设计模式》的作者结城浩。写作中也参考了《C++并发编程实战》中的若干建议,致作者 Anthony Williams 和译者周全等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895225.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三周第五天

所用时间:315分钟 代码量(行):197 博客量(篇):1 了解到的知识点: 1.完成了简单的安卓程序开发 通过springboot后端应用服务器将安卓程序插入到mysql数据库 程序页面如下:刚开始添加好一会儿都进不去,原来是服务器没弄好,服务器路径一定要搞好 我测试用的路径:url(&…

第二次作业-个人项目

第二次作业这个作业属于哪个课程 第二次作业这个作业要求在哪里 作业要求这个作业的目标 完成论文查重程序Github仓库地址 https://github.com/Simonysc-123/3123004761PSP2.1 Personal Software Process Stages 预估耗时(分钟 实际耗时(分钟)Planning 计划 10 15Estimate 估…

项目里如何引入阿里巴巴矢量图标库-iconfont

项目里如何引入阿里巴巴矢量图标库-iconfont 一、搜索或者直接选择自己想要的图标类型 二、选中想要的图标,加入购物车,可以选择多个 三、点击购物车可以将选择的图标加入原有项目,也可以新建项目 四、确定之后,选择下载至本地(下载后的图标是灰色的,没有颜色,若想有…

Qt个人项目总结 —— MySQL数据库查询与断言

3.Qt项目总结——数据库查询断言问题问题:当我使用MySQL数据库的查询操作时, 如果查询的数据在数据库中不存在,那么Qt会直接被干崩溃 但是?为什么呢?不应该是返回if语句中的结果吗,为什么会崩溃呢?bug代码示例 =======================================================…

Effective log parsing in log streams using fixed depth forest 论文笔记

挑战 主要讲的是 Drain 的一些问题: ① 对于变量开头的日志会存在解析错误 ② 常量在变量之前发生变化的日志也会导致解析错误 框架预处理 对于源日志,采用随机修改 token 的下标(即顺序)分成几个子日志,相当于数据增强 候选模版生成 这里采用的就是 Drain 的解析过程,为…

P2241 统计方形(数据加强版)

题目背景 1997年普及组第一题 题目描述 有一个 $n \times m$ 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。 输入格式 一行,两个正整数 $n,m$($n \leq 5000,m \leq 5000$)。 输出格式 一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形…

2025扩展可能性采购和供应链管理使用AI报告100+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p=40348 在当今快速发展的商业环境中,采购和供应链管理领域正经历着深刻变革,人工智能(AI)技术的融入成为推动这一变革的关键力量。 本报告汇总解读聚焦于AI在采购和供应链管理中的应用,深入剖析其发展现状、面临挑战与潜在机遇。通过对大量…

通义灵码AI程序员深度测评:这些能力体验感拉满!满血版 DeepSeek 玩法大揭秘

随着科技的发展,AI编程,或者说是AI辅助编程,已经成为了每一位程序员的福利。今天我们要说的AI程序员,相对于传统的AI辅助编程工具, AI 程序员具备多文件代码修改(Multi-file Edit)和工具使用(Tool-use)的能力,可以与开发者协同完成编码任务,如需求实现、问题解决、单…

从星链到数字样机:直升机智能化升级的双引擎

​直升机作为一种多功能航空器,凭借其垂直起降、空中悬停的独特优势,在军事、民用、救援等多个领域发挥着重要作用。然而,受制于传统通信导航性能瓶颈与机械系统脆弱性叠加效应,直升机在复杂环境下仍面临通信中断、导航精度不足、数据传输受限等问题,其物理特性与技术架构…

manim边学边做--局部缩放的场景类

在动画制作中,尤其是数学和科学可视化领域,有时我们需要将观众的注意力集中在场景的某个特定部分。 Manim提供了一个强大的工具 ZoomedScene,它允许我们在场景中创建一个独立的缩放视图,从而实现对局部细节的深入展示。 本文将详细介绍ZoomedScene的作用、参数、方法,并通…