私はツリーデータ構造を持っています。通常の挿入および削除関数に加えて、ツリーに存在するノードから特定の値を計算する COMPUTE 関数があります。挿入関数と削除関数はツリーに影響します。ただし、COMPUTE 関数はツリーを変更しません。COMPUTE 関数には独自の内部キューがあり、これらのキューにノードを追加および削除します。ここでは、compute 関数の簡略化された疑似コードを示します。
class tree{
vector<int> value;
tree * children
}
tree::COMPUTE(vector<int> inputValue)
{
Set currentSet;
Set nextSet
currentSet.add(root);
foreach (node in currentSet)
{
if(node has children)
foreach(childNode of node)
{
if(CONDITION_SATISFIED(childNode))
add childNode to nextSet;
}
else
output childNode
}
}
そのため、COMPUTE 関数は単純にツリーを再帰し、ノードを独自の内部セット データ構造に追加して、いくつかの計算を行います。
ここで、COMPUTE 関数をマルチスレッド化したいと考えています。ツリーを変更しないので、これは簡単に実行できると思います。各スレッドは独自の値を与え、独自の COMPUTE 出力を取得します。コードは C++ で記述されています。
私の質問はこれです:
私はこのようにそれを呼び出す場合:
void * threadRoutine
{
tree.COMPUTE(thisThreadVal);
}
int main()
{
tree myTree();
//Insertion Code here
call N threads each with different parameters but the same tree.
}
私はこれが正しいとは思わない。これは、すべてのスレッドが同じツリー オブジェクトの同じメンバー関数を呼び出すためです。そのため、COMPUTE メソッドで使用されるセットのような内部データ構造はマングルされます。
ツリーのメンバー関数としてではなく、ツリーの外に計算関数を記述する必要があると思います。これが正しいかどうか誰か教えてください。
ところで: 誰かが興味を持っている場合に備えて、私が使用する正確なツリーはカバー ツリーと呼ばれます。これは、最近傍クエリを見つけるために使用される比較的新しいデータ構造です。