Чтобы решить проблему (и лучше понять многозадачность), я написал реализацию небольшого пула потоков. Этот пул потоков запускает несколько рабочих потоков, которые извлекают задачи из очереди по мере их добавления клиентом пула потоков. Для целей этого вопроса, когда очередь задач пуста, все рабочие потоки завершаются.
Проведя базовый бенчмаркинг, я обнаружил, что приложение тратит около 60% своего времени на ожидание получения блокировки очереди. Предположительно, это в основном происходит в рабочих потоках.
Является ли это просто признаком того, что я не даю рабочим потокам достаточно работы, или что-то большее? Есть ли что-то простое, что мне может не хватать для увеличения пропускной способности рабочего потока?
EDIT: вот примерный псевдокод, который должен несколько проиллюстрировать ситуацию. Это единственные два места, где блокировка устанавливается/снимается во время выполнения рабочих потоков (что составляет большую часть времени работы приложения).
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);
}
}