确定它是否是C ++中的进程或线程

时间:2011-11-10 22:14:32

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

void *变量作为输入(只能指向进程或线程),我想先确定其类型,然后将其转换为该类型。

我应该如何用C ++做到这一点?我知道这是一个愚蠢的问题,但我以前从未做过C / C ++,也不能想到C / C ++。

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

4 个答案:

答案 0 :(得分:5)

你做不到。指针包含两条信息:内存中它们指向的位置以及指向对象的类型。使用void *时,这个最后的信息被省略,并且无法重建它所指向的类型。因此,您需要携带此指针另一个指定实际指向的值(您可以使用enum)。

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


  

我正在寻找一种统一的传递pid或tid的方法,但会以不同的方式处理ID。对不起,我可能没有正确陈述我的问题。

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

答案 1 :(得分:2)

有很多解决方案。

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

其他方法需要一些尊重的能力。

最明显的是,如果您已定义类型ProcessThread,请为它们提供一个公共基类,然后传递它而不是void*。这是基本的OOP。然后,您可以使用RTTI查找派生类型。但最有可能的是,在这种情况下,重构/重新设计将首先消除对此的需求。

如果您无法添加基本类型,则可以添加包装器并传递它。即使你看到的只是一个空洞*,这也有效。这类似于set<>解决方案,因为您需要在分配时知道类型。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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