请求、响应与超时机制详解
在C/S软件模型中,往往都遵循这请求和响应的机制,而且往往还伴随着超时控制。即:A发送请求,然后等待B的响应,同时开始超时计时,如果在超时时间内成功接收到响应,则结束等待和计时。如果到了超时时间还没有接收到响应,则结束等待同时此次通讯失败。
我们站在A端来设计。
A发送通讯请求,然后进入等待状态。此时常见的操作就是将当前线程挂起(suspend)。让挂起线程进入就绪状态有两个条件:超时或正确响应。当线程重新运行后,根据唤醒的方式不一样,执行不同的操作。如果是超时,则可能需要中断此次操作,然后上报错误信息。如果是正确响应,则结束超时计时,同时继续执行下一次传输。
这种模式我使用三种环境来说明:
- ucos ii(freeRTOS)
- linux
- qt5
ucos适用于低端嵌入式
linux适用于高端嵌入式和服务器
qt5适用于桌面上位机和客户端
ucos ii实现
ucos实现起来很简单,使用post/pend系列函数可以轻松实现,因为这类函数本身就带有超时控制。
INT8U OSMboxPost(OS_EVENT *pevent,void *pmsg);
INT8U OSMboxPend(OS_EVENT *pevent,INT32U timeout,INT8U *perr);
所以使用信号量或者邮箱能够很轻松的实现上面的要求。
linux实现
linux的线程同步可以使用条件变量,条件变量需要配合互斥锁使用。
互斥锁:
- pthread_mutex_