イベントが発生したときにマルチスレッドを使用してメンバー関数を呼び出すライブラリを使用しています。ライブラリ内の各「ハンドラ」には、 function を呼び出すことができるスレッドがありますMyClass::Process(const Signal& signal)
。MyClass には、 というCatalog
クラスへの参照がありcat
ます。
内部にProcess
は次のコードがあります。
Stats stats;//simple container struct to hold values
std:string id(signal.signalId());
//set values of stats here based on the values in signal
cat->onSignalUpdate(id, stats);
ライブラリのドキュメントから:
Handler の単一インスタンスの境界では、2 つのユーザー コールバックを同時に呼び出すことはできません。ただし、異なるチャネルの Handler の異なるインスタンスは相互にリンクされていないため、異なる Handler インスタンスからの呼び出しが並行して発生する可能性があります。
カタログにはメンバーがいますstd::map<std::string, Stats> signal_map
の中にCatalog::onSignalUpdate(const std::string& id, const Stats& stats)
std::map<std::string, Stats>::iterator it(signal_map.find(id));
if(it != signal_map.end())
{
it->second = stats;
}
これは、適切な Id が適切な Stats 構造体にマップされている場合に、ほとんどの場合機能します。ハンドラー A の ID がハンドラー B の ID に属する構造体に割り当てられている場合、不適切なマッチングが発生することがあります。関数が並行して呼び出されているように見えます。スレッド化では、並列処理中に関数呼び出しが重複するという印象を受けました。そうではありませんか、それともスレッドで参照によって値を渡すことに問題がありますか?