要解決的一個問題(和更好的多任務處理我的理解),我已經寫了一個小的線程池實現。這個線程池會加速一些工作線程,這些工作線程會在線程池的客戶端添加它們時將任務從隊列中彈出。出於此問題的目的,當任務隊列爲空時,工作線程全部終止。最大化工作線程利用
做一些基本的標杆,我已經發現了應用程序後花費〜其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);
}
}
我們需要查看一些代碼,以瞭解爲什麼您的應用程序卡在隊列鎖中。我認爲你的線程大部分時間應該停留在「等待」狀態(使用條件變量或類似的東西)。 – Starkey 2010-08-05 17:17:54