这是我第一次尝试使用std::future
.
我要同时解析三个不同的文件。三个功能分别做到这一点。称为和。parseSentences
_ 它们中的每一个都使用一个非常简单的 lambda 函数在单独的线程中启动: ,其中是一个静态变量,函数是我之前命名的三个函数之一。parseTags
parseLinks
std::async
[]() { parser->function(); }
parser
int parser::start()
{
int ret = SUCCESS;
ASSERT( m_output != nullptr );
static parser * thisParserInstance = this;
// parsing files
std::future<int> parseSentence = std::async(std::launch::async, []() { return thisParserInstance->parseSentences(); } );
std::future<int> parseLinksResult = std::async(std::launch::async, []() { return thisParserInstance->parseLinks(); } );
std::future<int> parseTagsResult = std::async(std::launch::async, []() { return thisParserInstance->parseTags(); } );
// retrieving the results
ret = parseSentence.get();
const int linksResult = parseLinksResult.get();
const int tagsResult = parseTagsResult.get();
if (ret == SUCCESS)
ret = linksResult == SUCCESS ? tagsResult : linksResult;
return ret;
}
现在,当我在 gdb 中运行我的程序时,在破坏一个std::future
局部变量时会发生分段错误。那时有 2 个线程正在运行。线程#1 的调用堆栈在这里。线程#2 的调用堆栈在这里。
请注意,this
第一个调用堆栈中的指针为空,导致分段错误。
如果有人有线索,我将不胜感激。