Однако я не могу получить доступ к нестатическому
член "значение" больше.
Это потому, что функция static
в вашем классе не имеет (а не может иметь) указатель this
. Все, что вам нужно - передать указатель на ваш Test
объект в функцию pthread_create () в качестве четвертого аргумента, а затем сделать это:
static void* thread_func(void* args)
{
Test *test = static_cast<Test*>(args);
test->value++;
//write return statement properly
}
Однако, если в thread_func()
вы делаете слишком много вещей, которые требуют доступа к Test
ученикам во многих местах, то я бы предложил этот вариант:
//this design simplifies the syntax to access the class members!
class Test
{
//code omitted for brevity
static void* thread_func(void* args)
{
Test *test = static_cast<Test*>(args);
test->run(); //call the member function!
//write return statement properly
}
void run() //define a member function to run the thread!
{
value++;//now you can do this, because it is same as 'this->value++;
//you do have 'this' pointer here, as usual;
//so access other members like 'value++'.
}
//code omitted for brevity
}
Лучший дизайн: определите класс многократного использования!
Еще лучше было бы определить повторно используемый класс с pure виртуальной функцией run()
, который будет реализован производными классами. Вот как это должно быть оформлено:
//runnable is reusable class. All thread classes must derive from it!
class runnable
{
public:
virtual ~runnable() {}
static void run_thread(void *args)
{
runnable *prunnable = static_cast<runnable*>(args);
prunnable->run();
}
protected:
virtual void run() = 0; //derived class must implement this!
};
class Test : public runnable //derived from runnable!
{
public:
void newthread()
{
//note &runnable::run_thread
pthread_create(&runnable::run_thread,..., this);
}
protected:
void run() //implementing the virtual function!
{
value++; // your thread function!
}
}
выглядит лучше?