c++ - pthread退出时运行函数

标签 c++ c pthreads threadpool

我有一个 C++ 应用程序,在其中创建 pthread 来运行用户提供的函数。我希望能够在线程退出时以某种方式收到警报,以便我可以将其从用于保留线程的 pthread 数组中删除。有没有办法做到这一点,或者该函数应该设置一些“神奇值”。因为生成 pthread 的主代码处于某种运行循环中,所以我可以轻松检查退出条件。


此外,正在使用 std::vector<pthread_t>过度跟踪我的线程是否重载?线程的数量不一定是任何常数,可以运行许多线程或很少的线程。或者是否有另一种 STL 容器适合这些添加和删除(添加总是在一端,删除几乎在任何地方)。是否有其他结构来跟踪 pthreads?这里是堆栈还是列表?或者一个具有慷慨最大好处的标准 C 数组?由于问题的性质,我还可以维护一个固定大小的工作线程数组,将必须执行的用户函数传递给这些线程。这是一个好的解决方案吗?

很抱歉这个长期困惑的问题,但我只使用过动态语言中的线程,这永远不会成为问题。


编辑(2012 年 3 月 8 日): 阅读@jojojapan的答案后,我决定使用某种线程池。在我的结构中,我有一个生产者(运行循环中的线程)和许多消费者(池中的工作线程)。是否有一种数据结构是为多线程、单生产者、多消费者使用而设计的?或者我应该使用 std::queuepthread_mutex_t就在上面吗?

最佳答案

  1. 您可能需要考虑的一个选择是,一旦线程完成任务,不真正结束并删除线程,而是让它们保持事件状态并让它们等待新任务分配给他们。您可以通过执行以下两件事来完成此操作:

    1. 在线程中使用(几乎)无限循环
    2. 使用并发队列或其他一些技术,使它们等待另一个线程发出的信号。设计模式和策略在几个 SO 问题中进行了讨论,例如this one
  2. 如果您确实想在线程结束后发送信号,则可以使用 pthread_cond_t 并对其调用 pthread_cond_signal就在线程到达其 return 语句之前。当然,假设有一些其他线程正在运行,等待这些信号并通过从 vector 中删除相应的线程来对它们进行操作。有关用法的详细信息在相应的手册页中进行了描述,也在 this SO post 中进行了描述。 .

与评论和问题的已编辑部分相关的编辑:

  1. 关于工作线程的数量:这取决于线程使用最多的资源。如果这些线程所做的主要是计算和一些内存访问,换句话说,如果它们受 CPU 限制,则使用 CPU 可以维护的尽可能多的线程是有意义的(具体来说,有一定数量的核心,以及 CPU 在开始相互减慢之前可以运行的每个核心的(硬件)线程数。您正在创建的线程(软件线程)应该大约一样多,或者可能更多(最多是两倍)根据 what @Tudor says here ))硬件线程是合理的。但是,如果您的线程大量使用内存(内存限制)或硬盘(IO 限制)或其他资源(例如网络、NFS 或某些其他服务器),您可能需要按顺序减少线程数(a ) 不导致它们互相阻塞,并且 (b) 不给某些资源施加不合理的过多负载。确定正确的线程数量可能需要进行试验,而保持数量可配置通常是一个好主意。

  2. 关于存储工作任务的最佳数据结构:concurrent bounded queue我在上面进一步引用的帖子的评论中提到的可能非常好。不过我自己还没有尝试过。但是,如果您想让事情变得简单,那么标准 std::queue 甚至简单的 std::vector 都不会是一个糟糕的选择,如果您保护他们正确地使用信号/互斥技术。

关于c++ - pthread退出时运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9612775/

相关文章:

c++ - 异常安全 C++ 共享指针

c++ - 如何在 Windows 上每毫秒或更快地做某事

Netbeans 中的 C pthread_barriers (cygwin)

c++ - 从包装函数调用时 pthread_create 什么都不做

c++ - pthread_cond_timedwait 立即返回 ETIMEDOUT

C++ SSE2 内在函数

c++ - 用 PolarSSL 替换 OpenSSL

c - 如何使用套接字检查打开的端口

c - 为什么c中条件运算符第二部分的赋值需要括号

c - C 中的 # 和 ## 宏