用volatile实现状态机的一点想法

用volatile实现状态机的一点想法


线程A:运行在主界面,可以进入管理界面,进行日常的操作,
比如说登记用户,导入导出用户,产生验证记录!恢复出厂设置!

线程B:运行一个socket客户端任务,
1.将A线程产生的数据上传至服务器!
2.接受并处理来自服务端的命令/请求!,如,设置用户,清除数据,清除验证记录等.

典型的思路,在处理用户数据的时候,就用Mutex锁就可以!

在这里尝试用两个volatile变量处理,处理各种状态机!

volatile bool bDeviceBusy = false; //设备是否忙!
volatile bool bInManagerMenu = false; //是否在管理菜单中

void SetDeviceBusy(bool bBusy);
void SetInManagerMenu(bool bBusy);

场景1:
1.线程B如要设置用户数据,可以先锁定设备SetDeviceBusy(true),视情况可考虑并sleep(n)一下.
2.线程A在主界面的循环中,判断bDeviceBusy的值,如果为true,则在主界面上显示"工作中...",并且锁定设备,不能进入其他任何操作!
3.线程B设置用户数据完成之后,调用SetDeviceBusy(false),
4.线程A在主界面的循环中,判断bDeviceBusy的值,如果为false,解锁设备,使设备正常工作!

场景2:
1.线程A进入了管理菜单,进行用户数据的设置,如,恢复出厂设置时,可以先SetInManagerMenu(true)
2.线程B在线程的循环中,判断bInManagerMenu的值,如果为true,则不处理大部分的事务,如果有网络命令,直接应答设备忙.
3.线程A操作完成之后,调用SetInManagerMenu(false),
4.线程B在线程的循环中,判断bInManagerMenu的值,如果为false,继续处理来自服务端的命令/请求!


优化方案:
通过一个变量的状态来实现.
//volatile int device_status = -1;

你可能感兴趣的:(用volatile实现状态机的一点想法)