我有一个程序,它不断地完成一些工作(比如服务器)和几个线程.哪个是从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); }
但我不知道如何正确释放线程或如何检查它是否是免费的.
解决方法
只需编写线程代码即可完成任何需要完成的工作.不要继续创建和连接线程.最简单的方法是使用
thread pool – 线程集合和线程安全的作业队列.池中的每个线程从队列中获取作业,完成该作业,然后等待另一个作业.
对于POSIX线程,通常使用互斥锁来保护队列,使用条件变量来允许线程等待工作.您可能需要一个布尔变量来跟踪程序是否正在关闭.
在伪代码中,每个线程执行此操作:
>获取互斥锁.
>检查程序是否正在关闭,如果是,请释放互斥锁并终止.
>检查队列是否为空.如果是,则阻止条件变量并转到步骤2.
>从队列中取出最高职位.
>释放互斥锁.
>做好这份工作.
>转到第1步.
要求线程完成工作,请执行以下操作:
>分配新的工作对象.
>填写要完成的工作(可以是指向函数的指针和该函数的参数).
>获取互斥锁.
>将作业添加到队列中.
>发信号通知条件变量.
>释放互斥锁.
去关机:
>获取互斥锁.>将关闭布尔值设置为true.>广播条件变量.>释放互斥锁.>加入所有主题.