私は最近ConwayのGame of Lifeでパターン検索プログラムを作成しましたが、実行が遅すぎて実用的ではありませんでした。
私はそれを並列化することにしましたが、失敗しました。それはセグメンテーション障害を引き起こし、これはデータ競争の可能性が非常に高い。
コードの簡単な説明は:std :: asyncのデータ競合の原因は何ですか?
/* ... */
#include <list>
#include <mutex>
#include <future>
#include <iostream>
#include <forward_list>
int main() {
/* ... */
while (true) {
/* ... */
std::forward_list</*pattern type*/> results;
std::list<std::future<void>> results_future;
std::mutex results_mutex;
for (/*All the possible unique pattern in given grid*/)
results_future.push_back(std::async([&]{
/*A very hard calculation*/
if (/*The pattern is what I'm looking for*/) {
std::lock_guard<std::mutex> results_guard(results_mutex);
results.push_front(std::move(/*The pattern*/));
}
}));
while (!results_future.empty()) {
results_future.front().wait();
results_future.pop_front();
}
if (!results.empty()) {
for (auto &res : results)
std::cout << "Pattern found:" << std::endl << res;
return 0;
}
}
}
私はresults
は、ラムダ式の関数スコープの外に宣言され、そこに変更されている唯一のオブジェクトであるかなり確信しているので、私はミューテックスとそれをロック。
しかし、データ競争はまだ存在します。それは何の原因ですか?
デバッガで実行するとsegフォールトはどこに発生しますか?コールスタックとは何ですか? –
'ラムダ式の関数スコープから宣言され、変更されている唯一のオブジェクトだと確信しています。すべてを捕捉せず、' results'をキャプチャして何が起こるかを確認してください。 – SingerOfTheFall
時々、セグメンテーションラムダスコープから宣言され、 '/ * All the ... * /'で修正されている 'search_grid'がラムダスコープのパターン型に変換されている間、フォルトが発生します。 –