【问题标题】:Concurrently using std::regex, defined behaviour?同时使用 std::regex,定义的行为?
【发布时间】:2013-07-07 19:39:38
【问题描述】:

是否可以在所有使用std::sregex_iteratorstd::regex_match 等的多个线程中使用std::regex 对象?

例如,以下是否会产生逻辑行为:

bool SomeFunc( const std::string& szString1, const std::string& szString2 ) 
{
     static const std::regex regexTest( "=== ([\\w]+) ===", std::regex_constants::optimize );

     std::future<bool> f = std::async( []( std::string szString ) {
        return std::regex_match( szString, regexTest );  
     }, szString1 );

     bool b = std::regex_match( szString2, regexTest );

     return (b && f.get());
}

我找不到任何说明是否同时使用const std::regex 会导致未定义的行为。据我所知,没有对正则表达式对象进行任何编辑,因此不应该通过同时使用它来引发未定义的行为?

提前致谢!

【问题讨论】:

    标签: c++ regex multithreading c++11


    【解决方案1】:

    是的,const std::regex 是线程安全的。实际上,标准库中的任何 const 方法都是线程安全的,请参阅:

    §17.6.5.9/3。 C++ 标准库函数不得直接或 间接修改可由线程以外的线程访问的对象(1.10) 当前线程,除非直接或间接访问对象 通过函数的非常量参数,包括 this。

    【讨论】:

    • 谢谢,我就是这么想的;我只是想要确认。
    • @ronag 你能在你的回答中解释他们为什么选择这个规范吗?另外,如何使用不属于 C++ 标准库的类来实现这一点?我希望你能抽出时间来回答这些问题! :)
    • @Tim "另外,如何使用不属于 C++ 标准库的类来实现这一点?" 我不明白你的问题...跨度>
    • @curiousguy 对不起,我的意思是别的;该声明说,由 C++ 标准库中的函数调用的任何类的 const 实例是线程安全的,对吗?如果我想让自己的函数线程安全怎么办?
    • @Tim:C++ 标准没有规定标准库中应该如何实现,这完全取决于每个标准库的实现者。我想你正在寻找另一个问题。但是是的,有几种工具可以实现线程安全,std::atomic、std::mutex、thread_local 等......
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2015-11-27
    • 2023-02-07
    • 1970-01-01
    • 2016-10-03
    • 2021-03-15
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多