重用线程pthread

时间:2013-11-23 20:02:13

标签: linux multithreading pthreads posix

我有一个程序不断地完成一些工作(比如服务器)和几个线程。哪个是从pthread库重用线程的正确方法?或者我每次都被迫创建一个新线程。我想至少重用pthread_t结构。我在考虑这样的事情:

int main() {
   pthread_t threads[some value];
   while (1) {
       get work;
       find a free thread;
       pthread_create(free thread, do work);
       pthread_join(done threads);
   }

但我不知道如何正确释放一个帖子或如何检查它是否免费。

1 个答案:

答案 0 :(得分:9)

只需编写线程代码即可完成任何需要完成的工作。不要继续创建和连接线程。最简单的方法是使用thread pool - 一组线程和一个线程安全的作业队列。池中的每个线程从队列中获取一个作业,完成该作业,然后等待另一个作业。

对于POSIX线程,通常使用互斥锁来保护队列,使用条件变量来允许线程等待工作。您可能需要一个布尔变量来跟踪程序是否正在关闭。

在伪代码中,每个线程执行此操作:

  1. 获取互斥锁。
  2. 检查程序是否正在关闭,如果是,请释放互斥锁并终止。
  3. 检查队列是否为空。如果是,则阻止条件变量并转到步骤2.
  4. 从队列中取出最高职位。
  5. 释放互斥锁。
  6. 做好工作。
  7. 转到第1步。
  8. 要求线程完成工作,请执行以下操作:

    1. 分配新的工作对象。
    2. 填写要完成的工作(可以是指向函数的指针和该函数的参数)。
    3. 获取互斥锁。
    4. 将作业添加到队列中。
    5. 发出条件变量信号。
    6. 释放互斥锁。
    7. 要关闭:

      1. 获取互斥锁。
      2. 将关闭布尔值设置为true。
      3. 广播条件变量。
      4. 释放互斥锁。
      5. 加入所有主题。