Решите, если это процесс или поток в C ++ - PullRequest
1 голос
/ 11 ноября 2011

В качестве входных данных укажите переменную void * (может указывать только на процесс или поток). Сначала я хотел бы определить ее тип, а затем преобразовать в этот тип.

Как мне это сделать в C ++? Я знаю, что это глупый вопрос, но я никогда раньше не делал C / C ++ и пока не могу думать о C / C ++.

РЕДАКТИРОВАТЬ : мне нужно добиться этого как в Linux, так и в Windows.

Ответы [ 4 ]

5 голосов
/ 11 ноября 2011

Вы не можете. Указатели несут две части информации: место в памяти, куда они указывают, и тип заостренного объекта. С void * эта последняя информация опущена, и нет никакого способа восстановить, на какой тип она указала. Таким образом, вам нужно иметь с этим указателем другое значение, которое указывает, на что он фактически указывает (вы можете использовать, например, enum).

Единственное средство, так или иначе связанное с этой задачей в C ++, - это RTTI, но оно работает только на указателях на полиморфные классы (RTTI обычно использует vtable объекта для хранения дополнительной информации о динамическом типе указателя, но vtable может быть доступным и правильно интерпретированным, только если известно, что объект принадлежит к определенной полиморфной иерархии классов).

<ч />

Я ищу унифицированный способ передачи pid или tid, но буду относиться к идентификаторам по-разному. Извините, я не могу правильно изложить свою проблему.

Ну, это совсем другое дело ... если вам нужно передать свой PID / TID внутри void *, вы можете просто создать struct или что-то подобное с членом для идентификатора и одним для хранить, если такой идентификатор является PID или TID.

2 голосов
/ 11 ноября 2011

Существует множество решений.

Например, отслеживайте все созданные объекты Process и Thread.Сохраните их в set<void*> и проверьте наличие этих void* в ProcessSet или ThreadSet.Это решение просто требует, чтобы вы знали, где расположены объекты.

Другие подходы требуют некоторой способности уважать.

Очевидно, если вы определили типы Process и Thread, дайте им общий базовый класс и передайте его вместо void*.Это основной ООП.Затем вы можете использовать RTTI, чтобы найти производный тип.Но, скорее всего, в этой ситуации, рефакторинг / редизайн избавит от необходимости в первую очередь.

Если вы не можете добавить базовый тип, вы можете добавить обертку и передать ее.Это работает, даже если все, что вы когда-либо видите, это пустота *.Это похоже на решение set<>, в котором вам необходимо знать тип при выделении.

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

Все это действительно сводится к следующему: если вы знаете тип для начала, избегайте егоинформация прочь в первую очередь.

1 голос
/ 11 ноября 2011

О какой системе вы говорите? В Linux я бы сказал, что ваш вопрос не имеет никакого смысла, потому что процессы не имеют адресов (pid_t, возвращаемое fork или getpid - целое число).

Вы можете использовать библиотеки, которые обертывают процессы и потоки как объекты, как Qt (и работает в Linux, Windows, MaCOSX ...). (и вы можете, например, использовать dynamic_cast или мета-объектную систему Qt , если вы уверены, что указатель указывает либо на экземпляр QThread, либо на экземпляр QProcess).

0 голосов
/ 11 ноября 2011

Единственное, что вы можете сделать, это прикрепить type информацию к структурам процесса / потока.

...