Я думаю, что лучшим решением для использования таких вещей, как pthread (который принимает обратные вызовы c), является создание функции-обертки, чтобы вы могли гораздо проще использовать вместо нее управление boost :: functions. Это похоже на Использование boost :: bind () в коде C, будет ли оно работать? .
Тогда вы можете решить свою проблему просто с помощью boost :: bind
class myClass
{
void atom(myStruct *data); // void return type to keep it similar to other code
// You could change it to a void* return type, but then you would need to change the boost::function declarations
};
boost::function<void(void)> function = boost::bind(&myClass::atom,&myClassInstance,&myStructInstance); //bind your function
boost::function<void(void)>* functionCopy = new boost::function<void(void)> (function); //create a copy on the heap
pthread_t id;
pthread_create(&id,NULL,&functionWrapper,functionCopy);
Функция-обертка будет выглядеть следующим образом.
void functionWrapper(void* data)
{
boost::function<void(void)> *func = (boost::function<void(void)>* ) (data);
(*func)();
delete(func);
}
Хотя этот метод может быть более трудоемким, чем ручная передача данных, он гораздо более расширяем, что позволяет легко связать что-либо и передать его для запуска потока.
EDIT
Последнее замечание: myClassInstance и myStructInstance должны быть в куче. Если они находятся в стеке, они могут быть удалены до запуска вашего потока.