2011-12-14 2 views
0

Мне было удачно прикреплять поток к члену класса, используя код в нижней части этой страницы: http://www.tuxtips.org/?p=5.Функция члена pthread класса с аргументами

Я не могу понять, как развернуть код, чтобы инкапсулировать такой метод, как void* atom(void *inst), где *inst - это структура, содержащая различные параметры потока. В частности, ни Netbeans, ни я не понимаю, где определяется example::*f и как он может быть действительным в области thread_maker.

ответ

1

Я думаю, что лучшим решением для использования таких вещей, как 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 должны быть в куче. Если они находятся в стеке, они могут быть удалены до начала потока.

+0

Я не знаю достаточно о указателях функций, чтобы понять, как передать параметры через функцию Копия? Можете ли вы добавить строки, в которых вы явно передаете структуру в functionCopy? – Mikhail

+0

@Misha Если вы посмотрите на строку над созданием копии функции, это boost :: bind, которая превращает функцию-член, структуру и данные в одну функцию boost ::. Основная идея boost :: bind заключается в том, что она превращает нечто вроде 'void blah (int a)' в 'void blah()'. Функции-члены обрабатываются так, как если бы это была обычная свободная функция с первым параметром, являющимся указателем на объект, членом которого он является. например 'myClass :: atom (myStruct * data)' = 'anonFunc (myClass * this, myStruct * data)' – Lalaland

+0

@Misha Еще одна вещь, которую следует отметить, использование boost :: functions сильно отличается от указателей на функции. Указатели функций не могут содержать какое-либо состояние (только место для адреса функции). Boost :: функции могут содержать тонны состояния. – Lalaland

Смежные вопросы