gpt4 book ai didi

c++ - 使 boost::statecart::state_machine 线程安全的最简单方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 13:18:46 25 4
gpt4 key购买 nike

我正在使用 boost::statechart::state_machine 并且我遇到了机器崩溃。在对核心进行调查后,我意识到这是因为多个线程几乎同时处理了一个事件,其中一个线程称为终止,另一个线程崩溃是因为它试图使用已终止的对象。

因此,我需要知道我的选择是什么来使我的状态机线程安全。查看 boost 的 statechard documentation ,它明确指出 statecart::state_machine 不是线程安全的,并表明线程安全可以通过 aynchronous_state_machine 来实现。但是 asynchronous_state_machine 看起来它解决的问题不仅仅是线程安全,而且从 state_machineasynchronous_state_machine 的转换看起来很重要。我能否通过简单地锁定对 process_event 的调用来实现线程安全的实现?

最佳答案

作为互斥信号量或锁的替代品,您可以考虑监视器。

  • 状态机可能与您现在拥有的一样。

我知道有几种类型,并且我(不是最近)将 Hoare Monitor 用于我自己设计的状态机(不是 boost)。

来自 wiki-pedia:“在并发编程中,监视器是一种同步构造,它允许线程具有互斥和等待(阻塞)特定条件变为真的能力。”

我的 Hoare Monitor 实现将任何事件(输入到我的状态机)转换为发送到监视器线程的 IPC 消息。只有监控线程修改状态机。该机器(及其所有状态)是包含监视器线程及其方法的类的私有(private)数据。

有些更新必须是同步的,也就是说,一个请求线程会挂起,直到它收到一个 IPC 响应。一些更新可以是异步的,所以请求线程不需要等待。在处理一个线程请求时,监视器忽略其他线程请求,它们的请求简单地排队直到监视器可以到达它们。

由于只允许1个线程直接修改(私有(private)数据属性)状态机,不需要其他互斥方案。

这项工作是针对电信设备的,事件主要来自人类行为,时间紧迫。


状态机可能与您现在拥有的一样。您只需要实现监控线程,决定一个 IPC(或者可能是线程间通信)并确保只有一个线程可以访问状态机。

关于c++ - 使 boost::statecart::state_machine 线程安全的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com