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,保证输出的原子性;

cpp 复制代码
cout << "Now is" << time(NULL);

上面等价下式

cpp 复制代码
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 多线程服务端编程》

相关推荐
Dwzun18 小时前
基于Java+SpringBoot+Vue的校园二手物品置换系统设计与实现【附源码+文档+部署视频+讲解】
java·开发语言·spring boot
charlie11451419119 小时前
嵌入式Linux驱动开发(3)——内核模块机制 - Linux 的插件系统
linux·运维·开发语言·驱动开发·嵌入式硬件·学习
谭欣辰19 小时前
AC自动机:多模式匹配的高效利器
数据结构·c++·算法
nashane19 小时前
HarmonyOS 6.0 分布式相机实战:调用远端设备摄像头与AI场景识别(API 11+)
分布式·数码相机·harmonyos·harmonyos 5
张璐月19 小时前
[eCapture] OpenSSL 文件 Hook 机制
网络·ebpf·ecapture
C、空白格19 小时前
Java集成Vosk实现离线语音识别
java·开发语言·语音识别
亚空间仓鼠19 小时前
Docker 容器技术入门与实践 (四):Docker存储与网络
网络·docker·容器
编码浪子19 小时前
基于 Rust + Axum 的企业级权限管理系统设计与实现
开发语言·后端·rust
三月微暖寻春笋19 小时前
【和春笋一起学C++】(六十三)虚函数特性(二)
c++·基类·派生类·虚函数特性
历程里程碑19 小时前
MySQL事务深度解析:ACID到MVCC实战+万字长文解析
开发语言·数据结构·数据库·c++·sql·mysql·排序算法