生如夏花的博客

专注于工业物联网行业数据采集,嵌入式Linux系统裁剪,5G智慧网关软件开发等

线程同步之读写锁

读写锁也称为共享互斥锁,具有3种状态:读模式下的加锁状态写模式下的加锁状态不加锁状态

一次仅有一个线程可以占有写模式下的读写锁,但是多个线程可以同时占有读模式下的读写锁。

读写锁非常适合于对数据结构读的次数远大于写的情况

与互斥量相比,读写锁(reader-writer lock)运行更高的并行性。

线程同步之互斥量

当多个线程共享相同的内存时,需要确保每个线程看到的都是一致的数据视图。

当一个线程可以修改的变量,其他线程也可以读取或修改的时候,就需要对这些线程进行同步,确保访问变量时不会得到无效的值。

MQTT保活机制

MQTT保持活动机制是MQTT协议定义的一项功能。

MQTT客户端通过向代理发送为PINGREQ报文来维持与代理的连接。

MQTT代理通过接收PINGREQ来检测客户端是否无响应或断开连接,同理MQTT客户端通过接收PINGRESP响应来判断代理是否可用。

MQTT遗嘱

MQTT遗嘱(Last Will and Testament, LWT),允许客户端指定一条消息,在发生意外断开连接时,代理自动发布该消息到已订阅的其他客户端。

MQTT遗嘱 (LWT) 功能对于确保高效通信和在客户端意外断开时保持系统完整性至关重要。

MQTT保留消息

MQTT的保留消息可以为订阅者提供指定主题上的最新状态(前提是最新消息发布时保留标志设置为true)。

保留消息是保留标志设置为true的普通MQTT消息

每个订阅带有保留消息的主题的客户端在订阅后都会立即接收保留消息

当客户端向指定主题发送多条保留消息时,代理仅存储最后的保留消息以及相应的QoS级别。

代理为每个主题仅存储一条保留消息

MQTT持久会话

MQTT中的持久会话允许客户端在断开连接时维护其会话状态,包括订阅的主题和未传递的消息。

非持久会话在断开连接时丢弃会话状态,要求客户端重新连接上再次订阅主题,并可能错过在断开连接期间发布的消息。

持久会话和非持久会话的选择取决于应用程序对会话连续性和消息持久性的要求。

MQTT服务质量

MQTT Quality of Service(QoS,服务质量)是消息发送者和接收者之间的协议,用于定义消息的传递保证级别。

QoS具有3个级别,分别是:

  1. 最多一次(QoS 0)
  2. 至少一次(QoS 1)
  3. 确定一次(QoS 2)

其中涉及的MQTT报文有四种,分别是PUBLISH、PUBACK、PUBREC以及PUBCOMP。

MQTT主题

MQTT主题是MQTT客户端和代理之间进行通信的关键。

根据主题可以对消息进行有效的过滤和路由。

与消息队列相比,MQTT主题非常轻量。

客户端在发布或订阅所需的主题之前不需要创建该主题。代理接受每个有效的主题,而不需要事先进行任何初始化。