Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ICU正则表达式-多线程使用场景中的内存损坏_C++_Regex_Multithreading_Icu - Fatal编程技术网

C++ ICU正则表达式-多线程使用场景中的内存损坏

C++ ICU正则表达式-多线程使用场景中的内存损坏,c++,regex,multithreading,icu,C++,Regex,Multithreading,Icu,我有一个相当大的项目,它使用ICU正则表达式类。基本上,它可以在单线程模式下运行,也可以在多线程模式下运行。在后一种情况下,所有线程都初始化自己的内部数据(包括它们使用的正则表达式) 最初,该项目将shared_ptr用于regexpatern类来存储正则表达式以供进一步使用。 我认为regexpatern::matcher()调用是一个瓶颈,因为它需要额外的内存分配来分配新的RegexMatcher类,所以我决定切换到将共享的ptr存储到RegexMatcher,并在调用match之前调用re

我有一个相当大的项目,它使用ICU正则表达式类。基本上,它可以在单线程模式下运行,也可以在多线程模式下运行。在后一种情况下,所有线程都初始化自己的内部数据(包括它们使用的正则表达式)

最初,该项目将shared_ptr用于regexpatern类来存储正则表达式以供进一步使用。 我认为regexpatern::matcher()调用是一个瓶颈,因为它需要额外的内存分配来分配新的RegexMatcher类,所以我决定切换到将共享的ptr存储到RegexMatcher,并在调用match之前调用reset(str)

我想再次强调,正则表达式不是线程之间共享的

所以在单线程模式下一切都很顺利,应用程序的运行速度比我预期的稍快。 然而,当我试图一次运行10个处理线程时,ICU库开始给出奇怪的结果——在调试构建中,部分数据被部分初始化,一些无效值在这里和那里弹出

我查看了ICU代码,没有看到任何可能导致这种行为的静态内容

因此,问题是(主要是由于缺乏适当的文件): 1) 存储RegexMatcher而不是regexpatern是否有效(RegexMatcher有一个成员指向正在使用的模式)? 2) 文档中未列出的ICU正则表达式的多线程使用是否有任何限制

<>请注意:我的DEV平台是Visual C++ 2010,编译为Win32


注意:我无法在单独的测试应用程序中重现这种奇怪的行为,这种测试应用程序只在10个线程中同时进行正则表达式匹配,这就是问题相当开放的原因。

事实上我错了——有一种情况是从不同的线程使用单个正则表达式。显然,当使用RegexMatcher而不是regexpatern时,它会出现一些问题,可能值得提出一个bug,特别是如果您可以包含一个小测试用例,那么创建小测试用例是有问题的。我可能会花更多的时间调试这个问题,然后发布结果