Muduo_Day 2(muduo基础库)

(1)父子进程之间的继承:

fork()会产生一个和父进程完全相同的子进程,但子进程在此后会exec系统调用,出于效率考虑,linux中引入了“写时拷贝”copy on write技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间.
当fork()一个子进程之后,子进程会继承父进程的数据空间,堆和栈,文件描述符,代码段等.但不会继承父进程的父进程的内存锁,文件锁,某些定时器等,且fork()之后的子进程只有一个线程,其它的线程都消失了.

(2)mutable关键字:

mutable的意思是"可变的,其出现是为了突破const的限制.被const关键字修饰的函数,不能够改变类中的成员变量,能够使用,但不能修改他们的值;有时我们确实要修改一个成员变量的值,但又不想把该函数声明为非const,此时我们可以借助mutable修饰该成员变量,此时便可以进行修改.

(3)volatile关键字

作为指令关键字,简单地说就是为了防止编译器对代码进行优化.当要求使用volatile声明的变量的值得时候,系统总是重新从它所在的内存中读取数据,而不是使用保存在寄存器中的备份.即使它前面的指令刚刚从该处读取过数据.而且读取的数据立刻被保存.对于多线程编程来说,防止被编译器进行优化,别的线程对其修改.

(4)pthread_atfork函数:
#include 
int pthread_atfork(void*(prepare)(void),void(*parent)(void),void(*child)(void));

使用:调用fork时,内部创建子进程前在父进程中会调用prepare函数,内部创建子进程成功后,父进程会调用parent函数,子进程会调用child函数.

(5)__thread关键字

__thread是GCC内置的线程局部存储设施,每个线程都有一份.但只能用于修饰POD类型,不能修饰class类型.因为不能自动调用构造函数和析构函数.若声明的变量前不加__thread关键字,则类似于全局变量,所有的线程共享.

(6)CountDownLatch:

作用:线程之间的同步;

  • 主线程发起多个子线程,等这些子进程各自完成一定的任务之后,主线程才继续执行.通常用于主线程等待多个子线程完成初始化.
  • 主线程发起多个子线程,子线程都等待主线程,主线程完成其他一些任务之后通知子线程开始工作执行.通常用于多个子线程等待主线程发出"起跑"命令.

你可能感兴趣的:(Muduo_Day 2(muduo基础库))