当前位置: 首页 > 知识库问答 >
问题:

线程池应该如何在C中实现?

苏洛城
2023-03-14

我在C编程,但我只使用pthread. h,没有升压或C 11线程。

所以我试图使用线程,但是基于我之前的一个问题(链接),这似乎是不可行的,因为线程在完成任务后立即终止,使用线程池实现的一个更普遍的原因是通过以下方式减少线程创建开销为多个任务重用这些线程。

那么,在C中实现这一点的唯一其他方法是使用fork()并创建从主进程到子进程的管道吗?或者有没有一种方法可以在线程和它们的父线程之间设置一个我不知道的管道?

非常感谢!

共有3个答案

朱毅
2023-03-14

似乎不可行,因为线程在完成任务后立即终止。

for(;;){
  Task *myTask=theCommonProducerConsumerQueue->pop();
  myTask->run();
}

.. 不归还任何东西,事实上,不归还。

夏弘文
2023-03-14

来自POSIX标准:

int pthread_create(pthread_t *restrict thread,
   const pthread_attr_t *restrict attr,
   void *(*start_routine)(void*), void *restrict arg);

(...) 线程是通过执行start_例程创建的,其中arg是其唯一参数。

所以,你应该用这个函数创建一组线程,让它们都执行一个类似

void *consumer(void *arg)
{
    WorkQueue *queue = static_cast<WorkQueue *>(arg);

    for (task in queue) {
        if (task == STOP_WORKING)
            break;
        do work;
    }
    return WHATEVER;
}

(在输入结束时,将nSTOP_WORKING项推送到队列中,其中n是线程数。)

请注意,pthreads是一个非常低级的API,提供的类型安全性非常低(所有数据都作为void指针传递)。如果您正在尝试并行化CPU密集型任务,那么您可能希望改用OpenMP。

董嘉祯
2023-03-14

是的,您可以在线程之间创建线程安全队列。然后池中的线程将坐在一个循环中,从队列中检索一个项目,执行它需要的任何操作,然后返回并获取另一个项目。

在C中,这通常更容易/更简单,因为在某些接口上达成一致(例如,重载operator()以执行任务的代码)更容易一些,但在基本层面上,您可以在C中完成所有相同的事情(例如,您放入队列中的每个任务结构将包含一个指向执行该任务的函数的指针)。

在您的例子中,由于您使用的是C,因此使用重载的operator()来完成这项工作可能更容易。任务的其余部分结构(或您选择的任何名称)将包含所需的任何数据,等等。

 类似资料:
  • 本文向大家介绍c++线程池实现方法,包括了c++线程池实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了c++线程池实现方法。分享给大家供大家参考。具体分析如下: 下面这个线程池是我在工作中用到过的,原理还是建立一个任务队列,让多个线程互斥的在队列中取出任务,然后执行,显然,队列是要加锁的 环境:ubuntu linux 文件名:locker.h 文件名:locker.cpp 文件名

  • 本文向大家介绍c++实现简单的线程池,包括了c++实现简单的线程池的使用技巧和注意事项,需要的朋友参考一下 c++线程池,继承CDoit,实现其中的start和end 头文件 CPP文件 以上所述就是本文的全部内容了,希望大家能够喜欢。 请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

  • 有关问题: 关于C 11: C 11: std::线程池? C 11中的异步(启动::a同步)会使线程池过时,以避免昂贵的线程创建吗? 关于升压: C提升线程重用线程 提升::线程并创建一个线程池! 我如何获得发送任务的线程池,而不必一次又一次地创建和删除它们?这意味着持久性线程可以在不加入的情况下重新同步。 我有如下代码: 与每次迭代都创建和加入线程不同,我更愿意在每次迭代中将任务发送给我的工作

  • 我正在使用多个线程在不同的表中插入插入记录。此外,我正在使用批处理的记录插入,以提高效率。 注意:要插入的记录数以百万为单位。 我的问题是,在这种多线程环境中,我应该使用连接池吗? 我关心的问题: 每个线程将运行相当长的时间来执行数据库操作。所以,如果我的连接池的大小是2,线程的数量是4,那么在给定的时刻只有2个线程将运行。因此,其他两个线程将会在很长一段时间内保持理想状态以获得连接,因为针对百万

  • 创建一个阻塞队列来容纳任务,在第一次执行任务时创建足够多的线程,并处理任务,之后每个工作线程自动从任务队列中获取线程,直到任务队列中任务为0为止,此时线程处于等待状态,一旦有工作任务加入任务队列中,即刻唤醒工作线程进行处理,实现线程的可复用性。 线程池一般包括四个基本组成部分: (1)线程池管理器 用于创建线程池,销毁线程池,添加新任务。 (2)工作线程 线程池中线程,可循环执行任务,在没有任务时

  • 本文向大家介绍请问C++怎么实现线程池?相关面试题,主要包含被问及请问C++怎么实现线程池?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1.设置一个生产者消费者队列,作为临界资源