【问题标题】:Obtain thread handles/id of a specific process获取特定进程的线程句柄/id
【发布时间】:2023-03-29 18:17:01
【问题描述】:

我有一个多线程嵌入式架构,其中包含 6 个特定于应用程序的进程,这些进程在执行初始化进程时执行。同样,每个线程都有自己运行的线程数。

我要做的是根据设备是否连接到电脑来暂停 1 个特定进程的正在运行的线程。

我已经尝试四处搜索,我发现最接近我正在寻找的内容如下:How to obtain list of thread handles from a win32 process?

但是,该代码返回所有正在运行的线程的列表。这对我不起作用,因为我试图暂停所有获得的线程,假设它们是从同一个进程中获得的,因此我也不检查它们属于哪个进程。

同样,我正在获取另一个进程中一个进程的运行线程列表。

Windows 中是否存在允许此类控制的现有方法,还是我不得不从整个列表中确定我需要挂起的线程?

【问题讨论】:

  • 我想要做的是暂停正在运行的线程。 不,那是你想要做的最后一件事。阅读SuspendThread 的文档。特别是这个函数主要是为调试器设计的。它不打算用于线程同步。如果调用线程尝试获取挂起线程拥有的同步对象,则在拥有同步对象(例如互斥锁或临界区)的线程上调用 SuspendThread 可能会导致死锁。 向线程发出挂起信号.
  • @DavidHeffernan 与使用SuspendThread 挂起线程有什么不同?我不太确定你的“给线程发信号”的意思。
  • 你用一个事件给线程发信号。线程定期检查事件。当它被设置时,它会等到事件被取消设置。但它必须从内部完成,以便线程在安全的情况下暂停自身。只有线程才能知道。
  • @DavidHeffernan 这种方法的问题是我试图从进程 2 中挂起进程 1 的线程。
  • 没关系。事件可以在进程之间共享。无论如何,你在这件事上别无选择。您无法从外部可靠地挂起线程。您需要接受这一点,然后转向合作解决方案。

标签: c++ multithreading winapi


【解决方案1】:

与其尝试强行挂起线程(当你在“不太幸运的时刻”挂起时,这可能会给你带来麻烦),你宁愿使用名为 CreateEvent() 并手动重置。

  • 命名事件很容易在进程之间共享。您只需使用相同的名称再次CreateEvent()。事件的典型名称为 MyCompany_MyProduct_MyFeature_EventName 以防止意外碰撞。
  • 当您WaitForSingleObject() 开启“设置”事件时,等待立即得到满足。
  • 当您等待“重置”事件时,等待会暂停您的线程,直到设置事件为止。
  • 您的第一个应用程序将使其线程在不执行任何工作时等待事件,因此可以安全地挂起。
  • 您将从第二个应用程序设置和重置事件以控制第一个应用程序。
  • 这样,您无需枚举线程,而且更加健壮。

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2010-12-30
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多