• 状态机——一种强大的思想利器


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

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

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

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

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

  • 相关阅读:
    利用connect建立前端开发服务器
    Bootstrap Popover 隐藏的Javasript方法
    Kafka 2.1.0压缩算法性能测试
    关于Kafka java consumer管理TCP连接的讨论
    Java API获取consumer group最新提交位移的时间
    关于Kafka producer管理TCP连接的讨论
    【译】Apache Kafka支持单集群20万分区
    关于Kafka broker IO的讨论
    Kafka 2.0 ConsumerGroupCommand新功能
    关于Kafka high watermark的讨论2
  • 原文地址:https://www.cnblogs.com/yuqiao-ray-vision/p/3666255.html
Copyright © 2020-2023  润新知