KalosAner Blog

「山穷水复疑无路,柳暗花明又一村。」

Linux 安装 Boost

一、安装依赖 本机测试环境 ubuntu 20。 安装编译工具: 1 sudo apt install gcc g++ 安装依赖库: 1 sudo apt install mpi-default-dev libicu-dev libbz2-dev 二、编译安装 B2 是Boost.Build的简写,目的在于使得编译C++项目更加便捷. Boost库的源码编译采用了B2工具....

Linux 制作使用动态库

一、制作动态库 使用 C++ 程序制作动态库和直接编译这个程序的命令一样,只是参数稍微不同。如果代码里边用到了线程库在制作动态库的时候不需要链接 -lpthread 或者 -pthread,在使用的时候链接就行。下面是制作动态库的 Linux 命令: 1 g++ -fPIC -shared demo.cpp -o libdemo.so -std=c++11 动态库命名需要以 libx...

C++ 左值与右值

一、引言 左值(lvalue):表示具名对象或内存中已有的资源,通常可以在表达式中多次使用。例如,一个变量 a 或数组元素等都属于左值。 右值(rvalue):通常指临时对象或表达式求值结果,它们没有持久化存储,往往在使用后即被销毁。例如,函数返回的临时对象或字面常量。 拷贝:在拷贝构造和拷贝赋值中,程序会分配新的内存并将源对象中的数据完整地复制到目标对象中。...

Linux 信号机制

一、引言 Linux 信号机制是进程间通信的一种方式,用于在不同进程之间传递信息。它通过向目标进程发送一个特定的信号来触发目标进程执行相应的处理操作。Linux 内核中实现信号机制的关键是信号处理函数和信号传递,每个进程都有一个信号表来表示该进程对不同信号的默认处理方式。 信号的处理函数等都是进程间级共享的。 执行信号的动作称为信号递达,信号产生到递达之间的状态称为信号未决。当一个进程...

僵尸进程和孤儿进程

一、引言 进程一般都是由父进程创建和回收,如果一个进程创建之后不进行回收就会一直占用资源,包括 PCB。 二、孤儿进程 一个进程还在执行,而他的父进程已经退出了,那么这个进程就会成为孤儿进程。孤儿进程会由 init 进程收养,之后当孤儿进程结束时也有 init 进程回收。 孤儿进程会拖累 init 进程,但是对系统的危害不大。 三、僵尸进程 一个进程执行完毕之后,它的父进程没有退...

C++ 标准库条件变量用法

一、引言 在多线程编程中,经常会有进程之间相互依赖的情况,最典型的情况就是生产者消费者模型。 二、条件变量 如果线程 A 的部分代码的执行需要依赖于线程 B 中的代码,线程 A 就需要等待线程 B 执行了被依赖的代码之后才可以执行,所以线程 A 需要一种方法可以在线程 B 中的代码执行完成后得到通知。这时就可以使用条件变量。 以生产者消费者模型为例 1 2 3 4 using na...

C++ 标准库信号量用法

一、引言 信号量就像一个原子类型的整型全局变量,可以进行增减,但是同时只能有一个线程进行操作。它也适用于生产者消费者模型。它是 C++20 引入的,编译必须使用 G++ 11 以上。 C++ 的信号量不需要手动销毁。 二、信号量 1 2 3 4 5 #include <semaphore> #define MAX_SEM 2 counting_semaphore<M...

C++ struct 对齐规则

一、引言 C++ struct 的大小通常不会直接等于各个成员大小的总和,这是因为太过精细地分配内存会导致内存分配和访问的效率过低,所以一般对于不同大小的成员会采取对齐规则来分配内存。 结构体的地址和结构体中第一个成员的地址相同。 在 C++ 中,class 和 struct 唯一的区别就是:class 的成员默认是 private,而 struct 的成员默认是 publi...

如何确定合适的线程数

一、引言 在多线程编程中,线程的数量会影响并发的性能。 过多的线程会消耗更多的资源,包括: 内存:pthread_create 创建出来的线程每个线程需要传递一个函数,所以每个线程都需要分配一个栈空间,占 8192 bytes(ulimit -a:查询栈空间大小)。std::thread 每个线程占用的空间可能较小。 切换:线程切换上下文会消耗 CPU 和时间。 并且大量唤醒的线程...

阻塞、非阻塞、同步、异步

一、引言 简单梳理一下 IO 操作中阻塞、非阻塞、同步、异步等概念。 典型的一次 IO 都有两个阶段:数据就绪、数据读写。 大部分 IO 函数都会有内核缓冲区和用户缓冲区。当内核缓存区中有数据可以读或者有空间可以写就是数据就绪阶段,然后就可以进行数据读写。 二、阻塞与非阻塞 阻塞和非阻塞区别在于调用函数的线程是否需要等待结果。 阻塞:当一个线程调用阻塞 IO 函数时,该线程就...