1.spdlog
需要安装spdlog库,然后连接器增加-lspdlog
不需要复制头文件到目录,安装到机器上之后,从系统目录加载头文件即可。
部分用法:
2.redis
需要安装hiredis库,链接器-lhiredis
不需要复制头文件到目录,安装到机器上之后,从系统目录加载头文件即可
需要三部:connect, auth,command
部分用法:
3.json
之前用的是cjson,可以说是最简单的了,但是用起来比较麻烦。
现在用的是nlohmann json,更现代一些,用起来很轻松,只不过语法有点怪。
需要从github上取最新的头文件,不需要编译。注意别取错了,他有一个编译的版本、要找到那个单独头文件only的,非常方便。找错了就麻烦了。
引用json.hpp即可。
读取一个嵌套json,这时候语法就比较奇怪了,比如说.value()可以直接用=赋值给vector,这是我没想到的。
此外读取key(),也需要指明是string。
4.tcpshm库
一个轻松用来tcp/共享内存的库,一台机器上就配置成共享内存,跨机器就配置成tcp,可以说是完美契合我们目前需求的库。当然,两套方式接口一样。
只能用于linux
无需编译,直接引用头文件即可。
分为服务端和客户端。
客户端需要connect,然后就阻塞这个进程。等带OnMsg的消息即可。
服务端需要启动,然后等待连接即可。
注意消息号不要定义0,0默认是心跳。
封装的很好,很久没见到这么方便的库了。
-
tcpshm_client.h:客户端模板类。
-
tcpshm_server.h:服务器端模板类。
-
tcpshm_conn.h:封装tcp或shm的通用连接类,使用Alloc()/Push()和Front()/Pop()发送和接收msg。您可以从客户端或服务器端接口获取连接引用,并向其发送消息,即使它当前与远程对等方断开连接。
-
信号收到之后需要手动pop。再次启动之后可能会读到之前没读到的共享内存中的数据。
-
GitHub - MengRao/tcpshm: A connection-oriented persistent message queue framework based on TCP or SHM(shared memory)
.
5.一种线程间通信队列的方式
一种普遍的调用方式,使用互斥锁保护队列,使用条件变量进行通知,通过判断队列非空来避免虚假唤醒。
什么是虚假唤醒?
当一定的条件触发时会唤醒很多在阻塞态的线程,但只有部分的线程唤醒是有用的,其余线程的唤醒是多余的。
比如说卖货,如果本来没有货物,突然进了一件货物,这时所有的顾客都被通知了,但是只能一个人买,所以其他人都是无用的通知。