最近两天写代码很头大,不停的debug,还是会弹出莫名其妙的runtime error或者illagle memory access。 采用MFC写的程序,除了主线程又创建了定时器回调线程。定时器回调线程定期的对共享数据资源进行访问读写,主界面响应用户输入和申请释放资源。

问题产生了!2个线程过多的资源耦合,当共享的资源没有得到保护时,就发生了不确定性。更糟糕的是,在程序运行过程中主线程会释放资源,很可能发生的事情是,某一块内存资源已经被主线程释放,而定时器回调线程用指针引用被释放的资源,所以就反反复复的出现内存越界访问。

找到了症结所在,我就试图加锁,加关键段实现资源互斥的访问。更要命的事情出现了,我的的确确的在每个线程进入关键段之后又释放关键段,可为什么主线程无法获取到关键段资源呢!!!怎么办呢,莫非再试一试别的线程同步方法,例如互斥量/信号量?强大的互联网告诉我,关键段的效率比后者高。

有句话说的真不赖,“听君一席话,胜读十年书”,我的老同事说,遇到什么问题啦?我呜呜啦啦描述一番,他说,你没有必要纠结于使用什么方法让二者协调,为什么要这样做呢?我开始有点明白。他继续说,在一个稳定可靠的系统中,各个独立线程之间的资源耦合度一定要尽量的小,每一个线程申请自己的资源,也由他释放自己的资源,千万不要让一个线程释放属于另一个线程的资源。原来我错不在细节,在于结构的设计。他深思着继续说,在一些安全关键领域,常常采用一个大的while循环,通过设计复杂的状态机,每个状态小可能有子状态机,但是经过一些精确的计算,程序执行最长路径花费的时间有一个确定的上限。这样保证了实时性和可靠性。状态机设计一定要搞清楚状态跳转的条件和每个状态的功能。老同事一边说着,一边在本子上画着架构草图。我汗颜啊,醍醐灌顶,内心暗暗想,我回去一定要把状态机这个事情给想明白,怎么去设计状态机。

好了,扯这么多,只是想说明在听到真知灼见之前,你的思考方式是多么的混沌和无力。接下来,说说自己理解的状态机。