我正在使用boost::statechart::state_machine
并且我在机器中遇到了崩溃。在对核心进行调查后,我意识到它发生的原因是多个线程在同一时间处理了一个事件,其中一个调用了终止而另一个崩溃,因为它试图使用一个终止的对象。
因此,我需要知道我的选项是什么使我的状态机线程安全。在查看提升的statechard
documentation时,它明确指出statechart::state_machine
不是线程安全的,并且表明线程安全可以由aynchronous_state_machine
完成。但asynchronous_state_machine
似乎解决了更多问题而不仅仅是线程安全问题,从state_machine
转换为asynchronous_state_machine
看起来并不重要。我可以通过简单地锁定对process_event的调用来实现线程安全的实现吗?
答案 0 :(得分:0)
作为互斥信号量或锁的替代方法,您可以考虑使用监视器。
我知道有几种,而且我(最近没有)使用Hoare Monitor作为我自己设计的状态机(不是提升)。
来自wiki-pedia:“在并发编程中,监视器是一种同步构造,它允许线程具有互斥和等待(阻止)特定条件成为真的能力。”
我的Hoare Monitor实现将任何事件(输入到我的状态机)转换为监视器线程的IPC消息。只有监视器线程才会修改状态机。这台机器(及其所有状态)是包含监视器线程及其方法的类的私有数据。
某些更新必须是同步的,即请求线程暂停,直到收到IPC响应。某些更新可以是异步的,因此请求线程无需等待。在处理一个线程请求时,监视器忽略其他线程请求,它们的请求只是排队,直到监视器可以访问它们。
由于只允许1个线程直接修改(私有数据属性)状态机,因此不需要其他互斥方案。
这项工作是针对电信设备的,而且事件主要来自人类活动,并没有时间关键。
状态机可能就像你现在一样。您只需要实现监视器线程,决定IPC(或者可能是线程间通信)并确保只有一个线程可以访问状态机。