問題を解決するために (そしてマルチタスクの理解を深めるために)、小さなスレッド プールの実装を作成しました。このスレッド プールは、スレッド プールのクライアントによってタスクが追加されると、キューからタスクをポップする多数のワーカー スレッドを起動します。この質問の目的のために、タスク キューが空の場合、ワーカー スレッドはすべて終了します。
いくつかの基本的なベンチマークを行った後、アプリケーションがキュー ロックの取得を待機するために最大 60% の時間を費やしていることを発見しました。おそらく、これは主にワーカー スレッド内で行われています。
これは、ワーカー スレッドに十分な処理を与えていないことを示しているにすぎないのでしょうか。ワーカースレッドのスループットを向上させるために欠けている可能性のある簡単なものはありますか?
編集:これは、物事をある程度説明するための大まかな擬似コードです。これらは、ワーカー スレッドの実行中にロックが取得/解放される唯一の 2 つの場所です (アプリケーションの実行時間の大部分です)。
std::list<task_t> task_list;
// Called by the client to add tasks to the thread pool
void insert_task(const task_t& task)
{
lock_type listlock(task_mutex);
task_list.push_back(task);
}
// The base routine of each thread in the pool. Some details
// such as lifetime management have been omitted for clarity.
void worker_thread_base()
{
while (true)
{
task_t task;
{
lock_type listlock(task_mutex);
if (task_list.empty())
continue;
task = task_list.front();
task_list.pop_front();
}
do_task(task);
}
}