如何在线程池中正确分配 pthread 空闲状态?

Posted

技术标签:

【中文标题】如何在线程池中正确分配 pthread 空闲状态?【英文标题】:how to properly assign pthread idle status inside a threadpool? 【发布时间】:2020-11-15 16:03:46 【问题描述】:

我正在使用下面的代码创建一个线程池,但是我找不到合适的地方设置线程空闲状态,如何修改下面的代码以便我可以选择哪个线程忙?

std::vector<structThread> preallocatedThreadsPool;
std::queue<int> tcpQueue;
struct structThread 
    pthread_t thread;
    bool idleState;
;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;

void* threadFunctionUsedByThreadsPool(void *arg);
std::atomic<bool> stopCondition(false);



main () 
   preallocatedThreadsPool.resize(preallocatThreadsNumber); // create a threadpoOl.           
     for(structThread &i : preallocatedThreadsPool) 
         pthread_create(&i.thread, NULL, threadFunctionUsedByThreadsPool, NULL);
     
       

  // when a event happened
  pthread_mutex_lock(&mutex); // one thread mess with the queue at one time
  tcpQueue.push(even);
  pthread_cond_signal(&condition_var);
  pthread_mutex_unlock(&mutex);




void* threadFunctionUsedByThreadsPool(void *arg) 
    pthread_mutex_lock(&mutex);
    while (!stopCondition) 
           // wait for a task to be queued
       while (tcpQueue.empty() && !stopCondition) 
           pthread_cond_wait(&condition_var, &mutex); // wait for the signal from other thread to deal with client otherwise sleep
       
       if (stopCondition == false) 

           newevent = tcpQueue.front();
           tcpQueue.pop();
           pthread_mutex_unlock(&mutex);  // exit lock while operating on a task
           // do even related task
           pthread_mutex_lock(&mutex);  // re-acquire the lock
       
 
    
   // release the lock before exiting the function
   pthread_mutex_unlock(&mutex);
   return NULL;

上面的代码,每次从队列中弹出一个新的偶数时,我如何找到一种方法将相应线程的无遗嘱设置为忙?因为目前,每次有任务来,系统只是随机给我的线程池中的线程分配一个任务,如何修改代码让我的线程池可以记住每个线程的空闲状态

【问题讨论】:

不要将任务分配给线程。将它们放在一个队列中,让线程在准备好后从队列中取出项目。 不要设置线程空闲状态。当线程空闲时,它应该等待。您可以为此使用 condition_var。我看到您正在将 POSIX/C 库与 C++ 混合使用。 C++ 有它自己的与 POSIX 接口的库,它更简单。看看我的例子:github.com/doa379/libqueue- 【参考方案1】:

上面的代码,每次从队列中弹出一个新的偶数时,我如何想办法将相应线程的无遗嘱设置为忙?

这很简单:只需在 pthread_mutex_unlock 之前设置 idleState = false 并在重新锁定互斥锁后(在完成与事件相关的代码之后)返回到 true

因为目前,每次有任务来,系统只是随机分配一个任务给我线程池中的线程

使用线程池的正确方法。您想做的任何其他事情都可能会添加错误。

【讨论】:

以上是关于如何在线程池中正确分配 pthread 空闲状态?的主要内容,如果未能解决你的问题,请参考以下文章

Cartographer中的线程池操作

线程池

Java 多线程 - 空闲线程的状态

处理内存池中的碎片?

线程池你真不来了解一下吗?

SylixOS中pthread_cancel函数浅析