三、进线程与进线程通信
-
多线程操作使用pthread库来实现,可以传递参数,设置属性。
-
多线程通信:
- 互斥锁,pthread_mutex_xxxx,(相当于二元信号量)。lock,trylock 和 unlock 进行操作。
- 条件变量:pthread_cond_xxxx条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。条件变量上的基本操作有:触发条件(当条件变为 true 时);等待条件,挂起线程直到其他线程触发条件。条件操作可以不占用cpu,比如你一直判断某个条件是否成立,循环的话则会一直占用CPU。条件变量需要和互斥锁一起用。
- 读写锁:pthread_rwlock_xxxx,有强读者模式和强写者模式。
- 信号量:互斥锁相当于二元信号量,相当于将初始值设置为1,而信号量可以设置多初始值,适合用于比如一个营业厅能服务3个顾客这样的情况下进行同步操作。
-
多线程可重入函数:多个任务并发使用时不会出问题,要使用本地变量或者使用全局变量时保护数据。一些库函数有可重入版本,在所有程序前定义宏_REENTRANT来告诉编译器需要可重入功能。
-
僵尸进程和孤儿进程:父进程退出而子进程仍在运行是孤儿进程(没有父亲是孤儿);子进程退出而父进程没有wait时(子进程死了但没人管是僵尸)。僵尸进程父进程没有wait然后就退出了,那么就由僵尸进程编程了孤儿进程。
-
守护进程:linux中的服务就是守护进程,脱离中断并在后台运行,避免执行过程中将信息显示在终端,并且不被终端的信息所打扰。可以通过一系列操作来实现运行一个守护进程。
-
进程间通信:主要是linux进程间的通信方式 IPC
- 管道(无名):父子或兄弟进程间的单向通信机制。有名管道也叫FIFO,可以实现不相关进程间的通信。
- 消息队列:在系统内核中创建的用于通信的消息的队列,可在无关进程间通信,通过一个key来定位。用得少了。
- 共享内存:两个不相关进程间的一块逻辑内存。创建后可以连接到自己的内存空间下,然后进行操作。两个进程可无关,通信效率高,直接读写内存而不需要传送。但是需要额外的同步机制来保证正确性。
- 信号量:线程的是posix的信号量,进程间是SYSTEM V的信号量。
四、常用类库
-
json
- 轻量级的数据交换格式,python下很好用,因为跟内置类型能一致,而C++中复杂一些。
- 两种结构:一种是 键-值对 的集合,python中的字典;另一种是值的有序列表,即列表数组。
- C++中需要通过json::value来获取格式中的内容。json::reader 和 json::writer 则是读写json字符串的方法。
-
Protobuf
- Google背部的混合语言数据标准。轻便高效的结构化数据存储格式,大部分的RPC都是使用这个格式来传输数据。