C++中实现多线程和分布式

这篇具有很好参考价值的文章主要介绍了C++中实现多线程和分布式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3. 多线程

(2)对于 需要写入但不需要等待响应的请求,可以使用 BlockingQueue 完成,例如 log,由一个专门的线程去写入文件,其他线程只需要往 BlockingQueue 写入即可;

(3)线程池大小的阻抗匹配原则

密集计算所占时间的比重为 P,系统一共有 C 个 CPU,线程池大小的经验公式为 T = C/P,P 的估值一般不准确,其最佳值可以上下浮动 50%;

如果 P < 0.2,T 可以取一个固定值,如 5C;

3.1 C++ 系统库线程安全性

(1)内存序:一个线程对某个共享变量的修改何时能被其他线程看到;

(2)C++ 的 iostream 不是线程安全的,可以改用 printf,保证输出的原子性;

cout << "Now is" << time(NULL);

上面等价下式

cout.operator<<("Now is")
	.operator<<(time(NULL));

即便保证了 ostream::operator<<() 是线程安全的,但不能保证其他线程不会在两次函数调用之间向 stdout 输出其他字符;

(3)exit(3) 在 C++ 中不是线程安全的

其除了终止进程,还会析构全局对象和已经构造完的函数静态对象,有潜在死锁可能;

3.2 多线程与 IO

(1)磁盘 IO;每块磁盘都有一个操作队列,多线程磁盘 IO 的一个思路是每个磁盘配一个线程,把所有针对该磁盘的 IO 都挪到同一个线程中,才可能比单线程快;(内核缓存了大部分数据的情况下,多线程也可能更快)

(2)网络 IO;socket 读写的特店是不保证完整性,多线程同时读写可能每个都会收到一部分数据,如何组合这些数据是一个难点;

(3)POSIX 标准要求每次新打开文件(含 socket)的时候必须使用当前最小可用的文件描述符

  • 串话
    • 一个线程正准备 read 某个 socket,第二个线程几乎同时 close 此 socket,第三个线程恰好 open 了另一个文件描述符,其号码可能与前面的 socket 相同;

    • 一个线程从 fd 收到耗时请求,并记住要把处理结果发送给 fd,但在处理过程中,fd 断开了连接,有新的连接到来,碰巧使用了相同的 fd。

C++ 中解决串话问题的办法,RAII,用 Socket 对象保证文件描述符,析构时关闭文件描述符;

采用 shared_ptr 管理 TcpConnection 生命期;(只要其他线程持有这个连接的指针其就不会析构,就不会造成串话)

3.3 fork

程序中有 fork 时需要注意,有可能会有对象构造一次,析构了两次

4. Protocol Buffer

4.1 Labels

(1)repeated 修饰

下述方法缺失的部分为变量名;
修饰 message 时,没有 set_ 方法
会有 add_ 方法
_size

修饰标量数值类型时,需要在后面加 [packed = true] 才能高效编码;

(2)optional

如果消息没有包含这个元素,访问其时会返回默认值;[default = 10],如果未显式指出默认值,为空值(对枚举类型,为第一个定义的枚举值);

(3)分配 field numbers

每个 field 都需要分配一个数(在该消息中是独一无二的)
为最经常使用的 field 分配 1 ~ 15,越低的数占用空间越少;

被删除的 field numbers 需要添加到保留列表中;

4.2 定义服务

(1)RPC 服务(单词首字母大写)

4.3 zero_copy_stream

尽可能减少内存拷贝,由流对象负责 buffer 申请,返回给调用者一个 buffer,指向最终的数据结构

5. C++ 编译

单遍编译,编译器只能根据目前看到的代码做出决策;

函数重载决议,编译器看到一个函数调用语句时,只能从目前已看到的同名函数中选出最佳函数,哪怕后面代码中出现了更合适的匹配;

(1)C 语言的链接模型

只从前面的章节引用后面的章节,只需一遍遍历即可完成链接;
因此链接时,越基础的库越放到后面;这种做法内存消耗小的多,如果不这样做,先处理基础库,链接器不知道库中哪些符号会被后面的代码用到,只能全部记住;反之,如果先处理应用库,只需记住目前未查到定义的符合即可;

(2)

编译器自动生成的 class 析构函数也是 inline 函数,有时需要显式写一个空的析构函数,防止代码膨胀或出现编译错误(例如使用前向声明和 pimpl 手法,如果是编译器默认析构函数展开时无法看到 Impl 的声明,会报错);

参考

《Linux 多线程服务端编程》文章来源地址https://www.toymoban.com/news/detail-807252.html

到了这里,关于C++中实现多线程和分布式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式集群与多线程高并发

      后台数据的处理语言有很多,Java 是对前端采集的数据的一种比较常见的开发语言。互联网移动客户端的用户量特别大,大量的数据处理需求应运而生。可移动嵌入式设备的表现形式   很多,如 PC 端,手机移动端,智能手表,Google  眼镜等。Server2client 的互联网开发模式比

    2024年02月08日
    浏览(48)
  • [Python系列] 线程、协程、进程和分布式

            我们在写脚本的时候,经常是单线程跑完了全部,毕竟自顶向下按照我们约定的方法运行下去是最规范的。但是很多时候,比如说合法地爬取一些网页信息,图片和资料啊,或者说一些合法的网络请求,读写文件之类的。如果还是单线程地one by one,那么将会影响我们

    2024年02月16日
    浏览(36)
  • 计算机网络】网络安全 : 计算机网络安全威胁 ( 四种网络攻击类型 | 主动攻击与被动攻击 | 分布式拒绝服务攻击 DDos | 恶意程序 | 计算机网络安全目标)

    一、网络安全内容 网络安全内容 : 网络安全概述 对称加密 和 非对称加密 体质 数字签名 因特网安全协议 链路加密 与 端到端加密 防火墙 二、四种网络攻击 四种网络攻击 : ① 截获 : 窃听 其它的 通信内容 , 不影响网络通信 ; ② 中断 : 中断 他人 的网络通信 ; ③ 篡改 : 篡改

    2024年02月12日
    浏览(53)
  • Unity与C++网络游戏开发实战:基于VR、AI与分布式架构 【1.6】

    3.8 Unity中使用协程         协程是在Unity中经常使用的一种辅助处理模式。比如,我们需要设计一个人一边走动一边去观察周围的情况,走动和观察这两种运动同时进行。这时我们可以使用多线程来处理这个问题,但是多线程在内存和CPU的调度时间上具有一些风险。此时在

    2024年04月10日
    浏览(47)
  • Lamport向量时钟算法的C++实现:在分布式系统中生成事件的部分排序并检测因果关系违规

    在处理分布式系统时,我们经常遇到的一个问题是如何跟踪和排序系统中发生的各种事件。这是一个非常重要的问题,因为在分布式系统中,事件的顺序可能会影响系统的行为和结果。为了解决这个问题,我们可以使用一种称为向量时钟的算法。 向量时钟是一种算法,用于在

    2024年02月14日
    浏览(31)
  • C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。

    目录 1. Nginx作为web服务器处理请求 2. http协议复习       Get方式提交数据 Post方式提交数据 3. fastCGI   3.1 CGI  3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装         1. 安装fastCGI     2. 安装spawn-fcgi 3.4 nginx fastcgi     4其他知识点 1. fastCGI环境变量 - fastcgi.conf  2. 客户端使用Post提交数据

    2024年02月12日
    浏览(46)
  • Cesium中实现多光源

    在讲实现多光源之前,先了解两种不同的渲染方式:前向渲染和延迟渲染。 前向渲染是现在最基础,也是最多引擎使用的标准。前向渲染的流程是给定一个几何体,引擎对其进行从顶点到像素着色器的一系列计算,然后输出到最终的图像缓冲区。场景中有多个几何体时,引擎

    2024年02月16日
    浏览(167)
  • 【Java】SpringBoot中实现多数据源切换

    在日常项目开发中,某些需求会让不同的数据落实到不同的数据库,也或许是不同的页面需要不同数据库中的数据,在这种场景下,我们可以使用多数据源的配置来完成,通过在springboot中的 yml 文件配置多个数据源方式即可完成该需求,接下来看一下我的案例。 这篇案例采用

    2024年02月01日
    浏览(84)
  • 【分布式】分布式锁

    单机多线程: 在 Java 中,我们通常使用 ReetrantLock 类、synchronized 这类 本地锁 来控制一个 JVM 进程内的多个线程对本地共享资源的访问 分布式系统: 不同的服务/客户端通常运行在独立的 JVM 进程上。如果 多个 JVM 进程共享同一份资源 的话,使用本地锁就没办法实现资

    2024年02月14日
    浏览(50)
  • 分布式系统中的分布式链路追踪与分布式调用链路

    本文分享自天翼云开发者社区《分布式系统中的分布式链路追踪与分布式调用链路》,作者:c****w 在分布式系统中,由于服务间的调用关系复杂,需要实现分布式链路追踪来跟踪请求在各个服务中的调用路径和时间消耗。这对问题排查和性能监控都很重要。 常用的分布式链

    2024年01月19日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包