Есть обёртка над pthread_create вида:
Код: Выделить всё
unsigned int startTh(pthread_t *thread, const pthread_attr_t *attr,
void *(*func)(void *), void *arg)
{
return pthread_create(thread, attr, func, arg);
}
Фукция, которая должна стартовать в потоке, со следующим прототипом - void *start(void *arg).
При таком прототипе компиляция заканчивается ошибкой:
Код: Выделить всё
stream.cpp: In constructor ‘Stream::Stream()’:
stream.cpp:47: error: no matching function for call to ‘Stream::startTh(pthread_t*, pthread_attr_t*, <unresolved overloaded function type>, int)’
thread.hpp:12: note: candidates are: unsigned int Thread::startTh(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
В случае, если я привожу прототип фукции к static void *start(void *arg), данной ошибке при компиляции не возникает.
Но в этом случае я не могу обратиться к необходимым мне переменным, ошибка приобретает вид:
Код: Выделить всё
stream.hpp:33: error: invalid use of member ‘Stream::imageWidth’ in static member function
stream.cpp:118: error: from this location
Описание класса:
Код: Выделить всё
class Stream : protected Thread {
typedef struct source_buff_s {
unsigned char *buff;
unsigned int size;
char *url;
pthread_mutex_t mutex;
} source_buff_t;
bool is_meta;
bool is_jpeg;
unsigned int imageWidth;
unsigned int imageHeight;
source_buff_t m_jpeg;
source_buff_t m_meta;
pthread_t streamThread;
pthread_attr_t attr;
public:
Stream();
~Stream(){}
private:
void *start(void *arg);
Передать необходимые аргументы в фукцию через структуру нельзя, так как к ним необходим доступ другой фукции этого класса из другого потока.
Вопрос возник потому, что во всех примерах по работе с потоками, которые я нашёл, не используется указатель static для фукций.
Вопрос - как необхомо вызывать фукцию в потоке что бы она имела доступ, и могла оперировать, внешними переменными?
Использую gcc 4.2.0, если это имеет значение.
Спасибо.