网站制作 需要什么网络技术,网站运营经验分享ppt,电脑制作网页的软件,企业自建网站的优势消息队列
消息队列是一种常用的线程间通讯方式#xff0c;用来传输数据。使用消息队列传输数据时有两种方法#xff1a;拷贝#xff1a;把数据、把变量的值复制进消息队列里#xff1b;引用#xff1a;把数据、把变量的地址复制进消息队列里。rtt使用拷贝值的方法。
…消息队列
消息队列是一种常用的线程间通讯方式用来传输数据。使用消息队列传输数据时有两种方法拷贝把数据、把变量的值复制进消息队列里引用把数据、把变量的地址复制进消息队列里。rtt使用拷贝值的方法。
消息队列的创建有两种方法动态分配内存rt_mq_create、静态分配内存rt_mq_init
rt_mq_create的函数原型
rt_mq_t rt_mq_create(const char* name, rt_size_t msg_size,rt_size_t max_msgs, rt_uint8_t flag); 其中flag可取两个值RT_IPC_FLAG_FIFO先进先出等待线程按照先进先出方式排队RT_IPC_FLAG_PRIO优先级等待队列将按照优先级进行排队优先级高的等待线程将会插队排在优先级低的等待线程前。
同样消息队列的删除/脱离也有两种方法rt_mq_delete()rt_mq_detach()。
删除消息队列rt_mq_delete()它会释放内存如果删除消息队列时有线程在等待该队列则内核会先唤醒这些线程线程返回值是 - RT_ERROR然后再释放消息队列使用的内存最后删除消息队列对象
rt_err_t rt_mq_delete(rt_mq_t mq); 发送消息有三种函数rt_mq_send() 发送消息rt_mq_send_wait() 等待方式发送消息rt_mq_urgent() 发送紧急消息。线程或者中断服务程序都可以往消息队列写入消息。发送消息时从空闲消息链表取一个空闲消息块把消息复制到该消息块然后把消息块挂到消息队列尾部。
使用 rt_mq_send()发送消息时队列中有空闲消息块时才能成功发送消息否则返回错误码(-RT_EFULL)。使用 rt_mq_send_wait()发送消息时如果队列中没有可用的空闲消息块会根据timeout 参数等待超时后才返回错误使用 rt_mq_urgent()发送消息时也要先得到空闲消息块它会把消息块放在消息队列的头部以便这个消息能被第 1 时间读取。
发送消息的函数原型如下
rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size);发送消息时如果消息队列已满并且有多个发送线程同时等待发送这时当接收线程接收一个消息时就会有一个空闲的位置如果该消息队列是RT_IPC_FLAG_FIFO那么就由等待最久的发送线程发送消息如果该消息队列是RT_IPC_FLAG_PRIO那么谁优先级高谁先发。
等待方式发送消息的函数原型如下
rt_err_t rt_mq_send_wait(rt_mq_t mq, const void *buffer,rt_size_t size,rt_int32_t timeout);发送紧急消息的函数原型如下
rt_err_t rt_mq_urgent(rt_mq_t mq, void* buffer, rt_size_t size); 当队列有消息时使用收消息函数可以从队列接收消息。如果没有消息根据指定的 timeout 参数等待直到超时结束。收消息的函数为rt_err_t rt_mq_recv 原型如下
rt_err_t rt_mq_recv (rt_mq_t mq, void* buffer,rt_size_t size, rt_int32_t timeout); 如果由多个发送线程通过同一个消息队列发出数据想要在接收线程中分辨数据来源可以将写入消息队列的数据换成结构体在结构体中写入数据来源
typedef struct {ID_t eDataID; //数据来源int32_t lDataValue; //数据
}Data_t;