如何在C ++中杀死等待超过一分钟或2分钟的线程[关闭]

问题描述 投票:2回答:2

我是c ++的新手,对c ++多线程有一定的了解。我最初有10个线程,并且我根据添加到多个映射的任务数量增加了线程数。我能够增加线程数,但如果任务数量减少,则无法终止线程。我想杀死等待超过2分钟的线程并根据任务减少线程数。谁可以帮我这个事 ??。请耐心等待我,因为我是c ++的新手,如果已经提出这个问题。提前致谢。

c++ c++11
2个回答
0
投票

一个简单的解决方案是创造一个“死亡的工作”。当你的经理想要缩小游泳池的大小时,它只是排队“死亡的工作”。当一个线程获得一个工作时,它会检查它是否是“死亡工作”,如果是,则彻底终止。

您可以通过同时保护作业队列的相同互斥锁保护活动线程计数和所需线程计数来执行相同操作。要终止线程,请减少所需的线程数并唤醒至少一个线程。线程唤醒时,在执行作业之前,检查实际线程数是否高于所需数量,如果是,则减少实际线程数并终止线程。


2
投票

有多种解决方案可能:

  • 退出。您的线程可能正在等待队列/互斥锁上的工作。详细信息取决于框架,但通常可以在此等待操作上设置超时。当达到超时时,线程可以简单地返回(终止自身)。通常,除非他们做坏事,否则你不会杀死线程。
  • 线程池。如果线程完成的工作受CPU限制,则应使用固定数量的线程。如果你有更多的线程而不是CPU核心做同样的工作,他们只是相互接触。改为使用固定的线程池,让未使用的线程在队列中等待 - 睡眠线程不会花费太多。
  • 基于事件的。如果线程完成的工作受I / O限制,请考虑使用偶数循环框架。线程化,特别是线程间同步,是非常棘手的。竞争条件和死锁很难调试,因此如果可以的话,应该避免共享内存访问的可能性。对于大多数I / O绑定操作,您不需要线程。您可以使用事件循环并行等待不同Web服务器的多个响应。支持这种方法的框架例如是asio和Qt。
© www.soinside.com 2019 - 2024. All rights reserved.