【问题标题】:Is matching a regex thread unsafe?匹配正则表达式线程不安全吗?
【发布时间】:2017-11-27 07:30:09
【问题描述】:

我有一个非常小的函数,它似乎会在我的某些线程中导致分段错误,但如果我在该函数的调用中添加锁保护,我的代码就可以正常工作:

int getROCIndexByName(const std::string& t_name)
{
   std::smatch match;
   std::regex_match(t_name, match, std::regex(R"(.*ROC ?(\d+))"));
   return std::stoi(match[1].str()) - 1;
}

这可能是线程不安全的,还是我只是幸运地通过添加保护来阻止我的代码?谢谢!

【问题讨论】:

  • 只是一个注释,但是这段代码没有错误处理。如果传递的字符串与正则表达式不匹配怎么办?
  • 除了可能的无效 arg 异常外,函数本身应该是线程安全的。所有局部变量。但是,如果您要使用静态变量,那不是线程安全的。
  • 只需确保线程中使用的所有内容至少与线程一样长。如果它没有足够的生命周期,则在将其传递到线程之前对其进行复制。字符串文字具有程序生命周期,因为它们是只读内存,是程序映像的一部分,就像您的机器代码一样。他们不会走开。 (如果它们在 DLL 中,那么如果 DLL 卸载,您可能会遇到问题。)
  • 字符串文字有一个存储类。如果在线程之间使用,它们应该声明为 const,只读。
  • 我在windows中使用的一般形式class CMyThread { CWinThread *pThd; BOOL Begin(); protected: static UINT ThreadFunc( LPVOID pParam ); }; BOOL CMyThread::Begin() { pThd = AfxBeginThread( ThreadFunc, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL ); pThd->ResumeThread(); } UINT CMyThread::ThreadFunc( LPVOID pParam ) { CMyThread *pThis = reinterpret_cast<CMyThread *>(pParam); } 然后你可以根据需要创建任意数量的对象。

标签: c++ regex multithreading


【解决方案1】:

您应该在访问 match[1] 之前检查是否确实存在匹配项。

【讨论】:

  • 这不是答案,应该是评论。我知道,总有一场比赛。
猜你喜欢
  • 2011-12-18
  • 2010-11-24
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多