【发布时间】: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