gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:01 25 4
gpt4 key购买 nike

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


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

对于这个长期困惑的问题,我深表歉意,但我只在动态语言中使用过线程,这永远不会成为问题。


编辑(2012 年 3 月 8 日):阅读@jojojapan 的回答后,我决定使用某种线程池。在我的结构中,我有一个生产者(runloop 中的一个线程)和许多消费者(池中的工作线程)。是否有一种数据结构是为多线程单生产者多消费者使用而设计的?或者我应该使用 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 ),硬件线程是合理的)。但是,如果您的线程大量使用内存(内存绑定(bind))或硬盘(IO 绑定(bind))或其他资源(例如网络、NFS 或其他服务器),您可能希望按顺序减少线程数(a ) 不要让它们互相阻塞,并且 (b) 不要对某些资源施加不合理的负载。确定合适的线程数可能需要进行试验,保持线程数可配置通常是个好主意。

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

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

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