2010-08-05 65 views
1

要解决的一个问题(和更好的多任务处理我的理解),我已经写了一个小的线程池实现。这个线程池会加速一些工作线程,这些工作线程会在线程池的客户端添加它们时将任务从队列中弹出。出于此问题的目的,当任务队列为空时,工作线程全部终止。最大化工作线程利用

做一些基本的标杆,我已经发现了应用程序后花费〜其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); 
    } 
} 
+1

我们需要查看一些代码,以了解为什么您的应用程序卡在队列锁中。我认为你的线程大部分时间应该停留在“等待”状态(使用条件变量或类似的东西)。 – Starkey 2010-08-05 17:17:54

回答

0

你设计安装,每个线程坐和“旋转”,试图获取锁。除非每个工作者线程都在执行工作,否则这种情况会不断发生 - 在这种情况下,锁定会不受欢迎,工作就会发生。

与您的所有线程只是坐在纺上的锁,你要使用相当多的CPU时间等待。根据您的设计,这是有点期待的。

你会发现受阻,如果你有较少的工作线程可能会大幅收缩时间的百分比 - 在这里你比线程更多的工作项目,并在该点,你会花很少的时间等待这个锁。

一个更好的设计是使用某种形式的无锁队列为您的工作队列,因为这可能防止在这一点上等待。另外,有一个等待句柄可以阻止工作线程,直到队列中有工作,这将防止不必要的旋转。

0

你是想用一个做到这一点单锁,多锁? Mutexs?你在用什么等待语义?

我就从你的描述猜测(这纯粹是猜测),你有类似的东西:

lock(theLock) { 
// ... do lots of work ... 
} 

在你的主线程,其包含的代码派遣到轻量级线程。一个原因可能会导致等待时间加剧,这是因为你需要从已经排队等待执行的线程中取回信号(再次,这是一个猜测,因为你没有给出任何代码)。你可能会解决这个

一种方法是使用一个明确的锁,如上切换,进入使用当你想线程抢工作的其中一个是脉冲信号一个互斥。

虽然没有看到您的当前实现,我不知道我能在更过这一点。