gpt4 book ai didi

linux - 线程pthread的复用

转载 作者:IT王子 更新时间:2023-10-29 00:57:47 24 4
gpt4 key购买 nike

我有一个程序,它不断地完成一些工作(类似于服务器),并且线程很少。重用 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 线程,通常使用互斥锁来保护队列,并使用条件变量来允许线程等待工作。您可能需要一个 bool 变量来跟踪程序是否正在关闭。

在伪代码中,每个线程都这样做:

  1. 获取互斥量。
  2. 检查程序是否正在关闭,如果是,则释放互斥量并终止。
  3. 检查队列是否为空。如果是,则阻塞条件变量并转到步骤 2。
  4. 从队列中取出最前面的作业。
  5. 释放互斥锁。
  6. 完成工作。
  7. 转到第 1 步。

要让一个线程做一个工作,这样做:

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

关闭:

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

关于linux - 线程pthread的复用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com