Я думаю, что лучшим решением для использования таких вещей, как pthread (которые принимают обратные вызовы c), является создание функции-обертки, так что вы можете гораздо проще манипулировать функциями boost ::. Это похоже на Using boost::bind() across C code, will it work?.
Тогда вы могли бы решить вашу проблему просто с усилением :: привязывать
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 должны быть в куче. Если они находятся в стеке, они могут быть удалены до начала потока.
Я не знаю достаточно о указателях функций, чтобы понять, как передать параметры через функцию Копия? Можете ли вы добавить строки, в которых вы явно передаете структуру в functionCopy? – Mikhail
@Misha Если вы посмотрите на строку над созданием копии функции, это boost :: bind, которая превращает функцию-член, структуру и данные в одну функцию boost ::. Основная идея boost :: bind заключается в том, что она превращает нечто вроде 'void blah (int a)' в 'void blah()'. Функции-члены обрабатываются так, как если бы это была обычная свободная функция с первым параметром, являющимся указателем на объект, членом которого он является. например 'myClass :: atom (myStruct * data)' = 'anonFunc (myClass * this, myStruct * data)' – Lalaland
@Misha Еще одна вещь, которую следует отметить, использование boost :: functions сильно отличается от указателей на функции. Указатели функций не могут содержать какое-либо состояние (только место для адреса функции). Boost :: функции могут содержать тонны состояния. – Lalaland