对我来说,使 boost::statechart::state_machine 线程安全的最简单方法是什么?
What's the easiest way for me to make boost::statechart::state_machine thread-safe?
我正在使用一台boost::statechart::state_machine
,我在机器中遇到了崩溃。 在调查内核时,我意识到它的发生是因为多个线程大约同时处理了一个事件,其中一个称为终止,另一个线程崩溃,因为它试图使用终止的对象。
因此,我需要知道使状态机线程安全的选项是什么。 在查看 boost 的 statechard
文档时,它明确表示statechart::state_machine
不是线程安全的,并表明线程安全可以通过 aynchronous_state_machine
来实现。 但asynchronous_state_machine
看起来它解决的问题不仅仅是线程安全,而且从state_machine
转换为asynchronous_state_machine
看起来并不平凡。 我可以通过简单地锁定对process_event的调用来实现线程安全的实现吗?
作为互斥信号量或锁的替代方法,您可以考虑使用监视器。
- 状态机可能就像你现在拥有的一样。
我知道有几种类型,我(不是最近)将Hoare监视器用于我自己设计的状态机(不是boost)。
来自维基百科:"在并发编程中,监视器是一种同步结构,它允许线程具有互斥和等待(阻止)某个条件变为真的能力。
我的Hoare监视器实现将任何事件(输入到我的状态机)转换为监视器线程的IPC消息。 只有监视器线程修改状态机。 此计算机(及其所有状态)是包含监视线程及其方法的类的私有数据。
某些更新必须是同步的,也就是说,请求线程挂起,直到收到 IPC 响应。某些更新可能是异步的,因此请求线程无需等待。 在处理一个线程请求时,监视器会忽略其他线程请求,它们的请求只是排队,直到监视器可以访问它们。
由于只允许 1 个线程直接修改(私有数据属性)状态机,因此不需要其他互斥锁方案。
这种努力是为了电信设备,事件主要来自人类活动,时间紧迫。
状态机可能就像你现在拥有的一样。 您只需要实现监视线程,确定IPC(或者线程间通信),并确保只有一个线程可以访问状态机。
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 请求最简单的 OpenMP 目标 GPU 示例
- 将时间戳打印到流的最简单方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++20 个模块在 clang (Windows):在最简单的示例中键入信息错误
- 对多个(可能)重叠范围进行分区的最简单算法
- 在 cpp 中最简单的图形实现
- boost::variant - 对变体应用算术的最简单方法
- 多线程 gtkmm 应用程序最简单的示例
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- 标准库容器最简单、性能差的哈希类是什么?
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- 无法获得最简单的JNI足以在Windows 10上运行
- 对我来说,使 boost::statechart::state_machine 线程安全的最简单方法是什么?
- 使std::thread异常安全的最简单方法
- 史上最简单的Mutex.这个例子行得通吗?它是线程安全的吗
- 在一个集合中保存一堆constchar*的最简单、最安全的方法