私のプロジェクトの1つでは、std::deque<T>::clear()
へのコールが大きなボトルネックとして特定されました。専用スレッドでSTLをクリアする
私はそのための専用、優先度の低いスレッドでこの操作を移動することを決めた:
template <class T>
void SomeClass::parallelClear(T& c)
{
if (!c.empty())
{
T* temp = new T;
c.swap(*temp); // swap contents (fast)
// deallocate on separate thread
boost::thread deleteThread([=]() { delete temp; });
// Windows specific: lower priority class
SetPriorityClass(deleteThread.native_handle(), BELOW_NORMAL_PRIORITY_CLASS);
}
}
void SomeClass:clear(std::deque<ComplexObject>& hugeDeque)
{
parallelClear(hugeDeque);
}
これは(VisualC++ 2010)正常に動作するようですが、私はすべての主要な欠陥を見落としているのだろうか。上記のコードに関するご意見をお待ちしております。
追加情報:
SomeClass:clear()
は、GUIスレッドから呼び出され、ユーザインタフェースは、呼び出しが戻るまで応答しません。一方、hugeQueue
は、クリア後に数秒間そのスレッドによってアクセスされる可能性は低いです。
デバッガを接続せずに実行しても速度が遅いですか? –
STLコンテナ自体はスレッドセーフではありません。そのため、マルチスレッド環境のコンテナで操作を行う前に、コードで前提とする必要があります。 – DumbCoder
はい。実際に使用しているdequeには何百万ものオブジェクト(intではない)が含まれています –