LINUX.ORG.RU

протаскивание объекта в статическую функцию


0

0

Наткнулся на такой учасок кода в википедии при изучении многопоточности. static void *thread_func(void *d) { ((Thread *)d)->run(); }

Зачем такая хитрая схема проброса указателся в статическую функцию. Почему нельзя просто static void *thread_func(Thread *d).


Функция вызывается для экземпляра d класса Thread, однако.

anonymous
()

Можно и даже лучше. Но как правило юзер дата, это произвольный тип.

Booster ★★
()

Потому что pthread_create хочет указатель на функцию, которая принимает void*.

mannaz
()

Документацию читать не получается?

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);

anonymous
()

Потому что в данном случае нестатический метод класса иначе потоком не сделать

yoghurt ★★★★★
()

> Почему нельзя просто static void *thread_func(Thread *d).

Совместимость типов не означает совместимость производных типов.

Thread* можно неявно преобразовать в void*

Но указатель на функцию принимающую Thread* нельзя преобразовать к указателю на функцию принимающую void*. Например если void* имеет больший размер чем Thread* и аргументы передаются на стеке, то такое преобразование будет disastrous.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

sizeof(Thread*) всегда равно sizeof(void*). Это на лоре уже обсуждалось.

anonymous
()

Если отбросить в сторону размышления о соответствии типов, то в C++ «просто так» нельзя указатели преобразовывать друг к другу, т.к. в инстансах классов бывают служебные поля, и поля классов забавным образом располагаются друг относительно друга в пределах одного инстанса.

dmitry_vk ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.