Функция-член класса pthread с аргументами - PullRequest
1 голос
/ 15 декабря 2011

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

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

1 Ответ

1 голос
/ 15 декабря 2011

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

...