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

(1)repeated 修饰

缺失的部分为变量名;

修饰 message 时,没有 set_ 方法

会有 add_ 方法
_size

参考

《Linux 多线程服务端编程》

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

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

相关文章

Datawhale 强化学习笔记(二)马尔可夫过程,DQN 算法

文章目录 参考马尔可夫过程DQN 算法&#xff08;Deep Q-Network&#xff09;如何用神经网络来近似 Q 函数如何用梯度下降的方式更新网络参数强化学习 vs 深度学习 提高训练稳定性的技巧经验回放目标网络 代码实战 DQN 算法进阶Double DQNDueling DQN 算法代码实战 参考 在线阅…

练习题 百亿富翁

题目 题目描述 这天小明买彩票中了百亿奖金&#xff0c;兴奋的他决定买下蓝桥公司旁的一排连续的楼房。 已知这排楼房一共有 N 栋&#xff0c;编号分别为 1∼N&#xff0c;第 i 栋的高度为 hi​。 好奇的小明想知道对于每栋楼&#xff0c;左边第一个比它高的楼房是哪个&…

【算法优选】 动态规划之简单多状态dp问题——壹

文章目录 &#x1f38b;前言&#x1f38d;[按摩师](https://leetcode.cn/problems/the-masseuse-lcci/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f340;[打家劫舍二](https://leetcode.cn/problems/house-robber-ii/description/)…

基于LDA的评论大数据的分析及主题建模

1.微博的关键词大数据采集&#xff1b; 已完成&#xff0c;待优化 2.LDA 错误1&#xff1a;使用了import pyLDAvis.sklearn&#xff0c;提示没有模块no module named pyldavis.sklearn。 默认安装 pyLDAvis3.4.1&#xff0c;最后降级处理&#xff0c;解决方式&#xff1a; …

给定一个整数数组和一个整数目标值,在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。(找到一个就返回)

#第一种方法# #时间换取空间&#xff1a;两个循环求解# def search(nums,target):for i in nums:start nums.index(i) 1for j in nums[start: ]:if i j target:result [nums.index(i)]next_index nums[start:].index(j) startresult.append(next_index)return result …

docker ps -a 要求只显示自己想要的信息

在使用 docker ps -a 要求只显示这下面这几个字段&#xff0c;不显示其他的内容&#xff0c;方便查看哪些容器在运行&#xff0c;那些已经挂起。 例子&#xff1a; 我只想想显示这几个字段&#xff1a; CONTAINER ID STATUS NAMES docker ps -a --format "table {{.ID}…

EasyX图形化学习(三)

1.帧率&#xff1a; 即每秒钟界面刷新次数&#xff0c;下面以60帧为例&#xff1a; 1.数据类型 clock_t&#xff1a; 用来保存时间的数据类型。 2.clock( ) 函数&#xff1a; 用于返回程序运行的时间,无需参数。 3.例子&#xff1a; 先定义所需帧率&#xff1a; const …

20230118-【UNITY 学习】增加攀登系统

替换脚本PlayerMovement_04.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerMovement_05 : MonoBehaviour {private float moveSpeed; // 玩家移动速度public float walkSpeed 7; // 行走速度public float sprintSpee…

[笔记]深度学习入门 基于Python的理论与实现(一)

代码仓库 gitee 1. python 入门 1.5之前是python安装和基础语法, 我直接跳过了 1.5 Numpy 深度学习中经常出现数组和矩阵运算&#xff0c;Numpy 的数组类 numpy.array 提供了很多便捷的方法 1.5.1 导入 Numpy import numpy as np1.5.2 生成 Numpy 数组 np.array()&#xf…

C++ 设计模式之策略模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】什么是策略模式&#xff08;第14种模式&#xff09; 策略模式是⼀种⾏为型设计模式&…

西门子WINCC常用C脚本1

1.置位&#xff0c;复位&#xff0c;取反 获取变量值&#xff1a;GetTagBit(可以是位也可以是字节&#xff0c;字&#xff0c;双字等具体字母不同) 设置变量值&#xff1a;SetTagBit 置位&#xff1a;SetTagBit&#xff08;"变量名",1&#xff09; 复位&#xff…

Node+Express编写接口---前端

前端页面 vue_node_admin: 第一个以node后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/vue_node_admin.git

java-log4j日志冲突解决

一、概述 java日志框架较多&#xff0c;其中主流的slf4j和commons-logging是日志接口&#xff0c;log4j、log4j2和logback是真正的日志实现库。 二、具体库单独使用 2.1 log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifa…

Ceph分布式存储(1)

目录 一.ceph分布式存储 Ceph架构&#xff08;自上往下&#xff09; OSD的存储引擎&#xff1a; Ceph的存储过程&#xff1a; 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘&#xff0c;一个网卡&#xff1a; 10节点为admin&#xff0c;20-40为node&…

指针理解C部分

目录 1.二级指针 2.指针数组 2.1指针数组的定义和表现形式 2.2指针数组模拟实现二维数组 2.2.1二维数组 2.2.2使用指针数组模拟实现二维数组 3.字符指针 2.数组指针 3.二维数组传参 4.函数指针 4.1函数指针变量的定义和创建 4.2函数指针变量的使用 4.3两段有趣的代码 4.…

Python自动化测试中APScheduler Flask的应用示例

使用背景 实际项目中&#xff0c;需要验证打点数据在各个系统中收集是否一致&#xff0c;而部分节点打点数据收集是通过异步任务实现的&#xff0c;等待时间比较久。为应对业务异步操作处理&#xff0c;实现异步数据的收集&#xff0c;经过调研后&#xff0c;选择了 APSchedule…

ASOP的电池设置

fuelgauge 中文直译为“油量表”。在Android中&#xff0c;通常是与电池电量相关的模块&#xff0c;主要是负责显示设备的电池状态信息。 BatteryManager 路径在android/os下&#xff0c;提供了与系统电池服务交互的api&#xff0c;用于获取实时电池状态信息&#xff0c;包含…

JMeter实操入门之登录

JMeter实操入门之登录 前言初级-无变量的登录线程组取样器-HTTP请求 进阶-定义变量的登录用户定义的变量获取JSON返回的数据-tokentoken设置全局变量 前言 安装及环境配置教程可移步&#xff1a;JMeter安装与配置环境 本篇文章针对小白进一步的认识及运用JMeter&#xff0c;围绕…

【一天一个算法】---时间轮算法

简介 时间轮算法&#xff08;Timing Wheel Algorithm&#xff09;是一种用于处理定时任务的算法。它的原理是使用固定大小的时间轮&#xff0c;将时间划分成一系列的时间槽&#xff08;time slot&#xff09;&#xff0c;每个时间槽表示一个时间间隔。每个时间槽关联一个任务列…

湖(岛屿)

from book&#xff1a;挑战程序设计竞赛