【问题标题】:Are boost spirit V2 Qi grammars thread safe?boost Spirit V2 Qi 语法线程安全吗?
【发布时间】:2018-10-06 11:56:59
【问题描述】:

在阅读 boost spirit V2 文档this SO-questionthis top google spirit doc result for spirit classic/v1 时,我找不到任何关于 boost spirit V2 语法和规则的线程安全的声明。一些人声称它不再像经典中那样,#define BOOST_SPIRIT_THREADSAFE 不会有任何影响,但如果 V2 在线程安全方面与经典没有任何不同,那么提到的来源并不是很清楚它是否在说话关于不同实例或共享实例。

所以我的主要问题是:


1. distinct Spirit V2 语法对象线程安全吗?

如果知道的话是可选的:

2。共享精神 V2 语法对象线程安全吗?

3.不同的精神 V2 规则对象是线程安全的吗?

4.共享精神 V2 规则对象线程安全吗?

我也将它标记为精神 x3,因为那里是同一个问题。

【问题讨论】:

    标签: c++ boost boost-spirit boost-spirit-qi boost-spirit-x3


    【解决方案1】:

    BOOST_SPIRIT_THREADSAFE 确实不适用于 Qi,它适用于 Classic。

    除此之外,线程安全性唯一取决于的是 Boost 是否使用线程支持构建。五年来我发现的所有迹象表明,没有任何库明确支持没有线程支持的构建。 (What exactly does `threading=multi` do when compiling boost?)。

    非终结符(语法和规则)是线程安全的,除非您派生出自己的非无状态语法并且 parse 操作不是 const。

    在实践中,更倾向于编写解析器,以便它们可以明确地被 const 限定:

    Parser const p;
    
    book ok = parse(f, l, p);
    

    X3 更容易证明线程安全,因为规则通常是 const 全局静态(甚至是 constexpr)并且本质上是无状态的。

    【讨论】:

    • 我不确定语法什么时候是无状态的,什么时候不是。我假设至少在我执行对其成员或外部执行写入副作用的语义操作时。但是我不确定当只是在ctor中分配一些规则并通过提升融合和解析器属性使用结构映射机制时,无状态是否仍然适用。如果您也对此发表声明,那么您的答案将是完美的,除了已经帮助/使我平静了很多。谢谢!
    • 如果规则是按位常量,那总是安全的。它们在逻辑上是 const 通常是安全的 - 至少有纪律的图书馆倾向于保护它(stackoverflow.com/questions/14127379/…)。除非您添加自己的状态,否则它们确实是无状态的。从逻辑上讲,您只需确保可以使用解析器的 const 实例。除非您像 hack 一样进行 const-cast 或在解析器之外存储对可变状态的引用,否则它应该是线程安全的。如果不是,它将与可变状态一样是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多