【问题标题】:Decide if it is a process or thread in C++判断它是 C++ 中的进程还是线程
【发布时间】:2011-11-10 22:14:31
【问题描述】:

给一个void *变量作为输入(只能指向一个进程或线程),我想先确定它的类型,然后再转换成那个类型。

我应该如何在 C++ 中做到这一点?我知道这是一个愚蠢的问题,但我以前从未做过 C/C++,现在还不能思考 C/C++。

编辑:我需要在 Linux 和 Windows 上实现这一点。

【问题讨论】:

  • 你在内核里面吗?用户模式程序每个都有自己的地址空间,它们不能有指向任何其他进程内存的指针。也许你有一个 pid/tid 而不是 void*
  • 哪个操作系统?指向的“进程”或“线程”是什么?
  • “进程或线程”是指你有代表这些东西的类吗?
  • @MarceloCantos 我正在寻找一种统一的方式来传递 pid 或 tid 但会以不同的方式处理 id。抱歉,我可能没有正确说明我的问题。
  • @TerryLiYifeng:你必须将 PID/TID 汇集到 void * 中,另一方面能够获得 ID 和它的类型,对吗?

标签: c++ multithreading pointers process void-pointers


【解决方案1】:

你不能。指针携带两条信息:它们指向的内存位置和指向对象的类型。对于void *,最后的信息被省略了,并且没有办法重建它所指向的类型。因此,您需要在此指针中携带另一个值,以指定它实际指向的内容(您可以使用例如enum)。

在 C++ 中唯一与此任务相关的工具是 RTTI,但它仅适用于指向多态类的指针(RTTI 通常利用对象的 vtable 来存储有关指针动态类型的附加信息,但 vtable 可以只有在知道对象属于特定的多态类层次结构时才能访问和正确解释)。


我正在寻找一种统一的方式来传递 pid 或 tid,但会以不同的方式处理 id。抱歉,我可能没有正确说明我的问题。

嗯,这是完全不同的事情...如果您需要在 void * 中传递您的 PID/TID,您可以简单地创建一个 struct 或类似的东西,其中包含一个 ID 成员和一个如果此类 ID 是 PID 或 TID,则存储。

【讨论】:

    【解决方案2】:

    有很多解决方案。

    例如,跟踪创建的所有 ProcessThread 对象。将这些分别存储在set<void*> 中,并检查void* 是否存在于ProcessSetThreadSet 中。此解决方案只要求您知道分配对象的位置。

    其他方法需要一定的服从能力。

    最明显的是,如果您定义了 ProcessThread 类型,请给它们一个公共基类并传递它而不是 void*。这是基本的 OOP。然后,您可以使用 RTTI 查找派生类型。但在这种情况下,最有可能的是,重构/重新设计一开始就不需要这样做。

    如果你不能添加一个基本类型,你可以添加一个包装器,然后传递它。即使您所看到的只是一个 void*,这仍然有效。这类似于set<> 解决方案,因为您需要在分配时知道类型。

    struct ProcessOrThread
    {
        bool isProcess_;
        void* handle_;
    };
    

    所有这一切都归结为:如果您知道要开始的类型,请避免首先丢弃这些信息。

    【讨论】:

      【解决方案3】:

      你说的是什么系统?在 Linux 上,我想说你的问题没有任何意义,因为进程没有地址(forkgetpid 返回的 pid_t 是一个整数)。

      您可以使用将进程和线程包装为对象的库,就像 Qt 所做的那样(它适用于 Linux、Windows、MaCOSX...)。 (如果您确定指针指向QThread 的实例或QProcess 的实例,您可以使用dynamic_cast 或Qt meta object system)。

      【讨论】:

        【解决方案4】:

        您唯一能做的就是将type 信息附加到进程/线程结构。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-18
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          • 1970-01-01
          相关资源
          最近更新 更多