を使用するのはこれが初めての試みstd::future
です。
同時に解析したい 3 つの異なるファイルがあります。3 つの関数がそれを行います。と呼ばれるparseSentences
、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
ローカル変数の 1 つが破棄されるときにセグメンテーション違反が発生します。その時点で実行中のスレッドは 2 つあります。スレッド #1 のコール スタックはこちらです。スレッド #2 のコール スタックはこちらです。
最初のコール スタックのポインタthis
が null であるため、セグメンテーション違反が発生することに注意してください。
誰かが手がかりを持っているなら、私は感謝します.