原帖 | Jack | 2025-02-26 15:33 | 👍1 | 阅读约1
AHT21这个handler这个策略效率好高,省去了一次队列消息回传(handler回复温湿度给调用者),而且不同的线程调用handler会有不同的新鲜度要求、拿到温湿度之后要做不同的事情,这些要求都可以通过修改event中的成员(.lifetime .type .pfcallback)来实现,调用handler的线程实现了“瘦身”不必在自身的线程函数中处理冗长的业务。
我原本以为和handler交互的线程是通过队列a发送请求,然后handler线程通过另一个队列b将读取到的温湿度数据回传给另一个线程,现在看明白了,在调用handler线程的线程中只需要创建一个event,在event中写入本次请求的要求(新鲜度阈值,读取的是温度or湿度or温度&湿度)以及一个回调函数指针,将这个event传递给handler线程即可
handler线程中一直读取队列,队列为空时就阻塞等待,当队列中有数据时handler线程才会被唤醒,在for循环中,handler线程一旦被唤醒,会copy队列中的event到自己的任务栈中,然后根据上家要求的新鲜度判断用不用更新自己任务栈里event中的温湿度数据。在拿到合乎要求(符合新鲜度要求)的温湿度之后,在上家给到的回调函数中执行上家定义的业务逻辑
也就是说,上家只发送event,不必接收handler读取的结果,上家肯定不是让handler读取就完事了,上家要用这些温湿度数据做一些事情的,但是这个具体的事情通过上家定义的回调函数给到handler线程,在handler线程中读取完温湿度之后执行上家定义的业务逻辑就ok了
有一说一这个callback函数就像是用户线程的“外包公司”一样
是的,总结的很好
相关笔记