为了解决一个问题(以及更好地理解多任务处理),我编写了一个小型线程池实现。这个线程池启动了一些工作线程,当线程池的客户端添加任务时,这些线程会从队列中弹出任务。出于此问题的目的,当任务队列为空时,工作线程全部终止。
在做了一些基本的基准测试之后,我发现应用程序花费了大约 60% 的时间来等待获取队列锁。大概这主要发生在工作线程中。
这仅仅是表明我没有给工作线程足够的工作,还是更多?我可能缺少一些简单的东西来增加工作线程的吞吐量吗?
编辑:这是一些粗略的伪代码,应该可以说明一些事情。这是在工作线程执行期间获取/释放锁的仅有的两个地方(这是应用程序运行时间的绝大部分。)
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);
}
}