mem_fun терпит неудачу, pthread и класс ptr
-
19-08-2019 - |
Вопрос
pthread
принимает в качестве параметра void *(*start_routine)(void* userPtr)
, я надеялся, что смогу использовать std::mem_fun
для решения своей проблемы, но не могу.
Я хотел бы использовать функцию void * threadFunc()
и сделать так, чтобы userPtr
выступал в роли класса (userPtr->threadFunc())
. Есть ли функция, аналогичная std::mem_func
, которую я могу использовать?
Решение
Одним из способов является использование глобальной функции, которая вызывает функцию основного потока:
class MyThreadClass {
public:
void main(); // Your real thread function
};
void thread_starter(void *arg) {
reinterpret_cast<MyThreadClass*>(arg)->main();
}
Затем, когда вы хотите начать поток:
MyThreadClass *th = new MyThreadClass();
pthread_create(..., ..., &thread_starter, (void*)th);
С другой стороны, если вам на самом деле не нужно использовать pthreads вручную, неплохо было бы взглянуть на Boost.Thread , хорошая библиотека потоков C ++. Там вы получаете классы для потоков, блокировок, мьютексов и т. Д. И можете выполнять многопоточность гораздо более объектно-ориентированным способом.