私が書いているマルチスレッドアプリケーションの問題については困惑しています。簡単に言うと、メインスレッドは、ファイルオブジェクトのリスト(ベクトル)を取得し、タイムスタンプをチェックし、変更されたファイルを別のベクターに渡すホットロードスレッドを開始します。マルチスレッドアプリケーションでのベクトルの使用
問題は、チェックする必要があるファイルの一覧に新しいファイルを追加しようとしたときに発生します。ホットロードスレッドは、リスト内のファイルの変更を継続的にチェックしています。反復処理中にスコープ付きロックでmutexをロック/ロック解除します。同様に、メインスレッドがaddItems()関数を呼び出すと、同じmutexが同様にロックされ、新しいファイルが追加されます。
私が読んだ情報によれば、これは適切なロックが与えられていればうまくいくはずですが、動作しますが、結果として非常に大きな減速が発生します。それは私がリストにも、一つのファイルを追加した場合、スレッドはますますロックになっているかのように...、、、
継続的に遅くなるプログラムですコード:
void MyThread::addItems(ItemList newItems)
{
ScopedLock<Mutex> lock(itemMutex_);
for (ItemList::iterator it = newItems.begin(); it != newItems.end(); ++it)
{
if (... test condition on (*it) ...)
items_.push_back((*it));
}
};
void MyThread::run()
{
_done = false;
do
{
YieldCurrentThread();
if (!isEmpty_)
{
ScopedLock<Mutex> lock(itemMutex_);
for (ItemList::iterator it = items_.begin(); it != items_.end(); ++it)
{
if (... test condition on (*it) ...)
updatedItems_.push_back((*it));
}
}
}
}
実行()関数のもちろん、item_eベクトルを繰り返し、addItems()関数を呼び出して別のスレッドから項目をベクトルに挿入します。 1つのスレッドだけがaddItems()を呼び出します。
それは難しいことはできませんが、私はまだ試していない解決策を示唆してそこに何かを見ていないよ...
EDIT:
- 思い出し以下のコメント私がaddItems()を呼び出さなければ、run()関数はアプリのパフォーマンスに大きな影響を与えていないように見えます。
書かれているように、updatedItems_は常にitems_から同じ項目を追加するように見えます。 –
addItemsメソッドがitemsパラメーターを使用していません。あなたはitems_の代わりにそれを繰り返すつもりでしたか? –
申し訳ありませんが、読みやすいようにコードを編集しました。 addItems()関数で、私はタイプミスをしました。彼らは修正されました。更新された項目に関しては、ファイルのタイムスタンプが最後にチェックされてから変更されたかどうかを示す条件テストがあります。そうであれば、それは更新リストにプッシュされ、その後メインスレッドに戻され、クリアされます。 –