简体   繁体   中英

C++: Creating new thread using pthread_create, to run a class member function

I have the following class:

class A
{
    private:
        int starter()
        {
             //TO_DO: pthread_create()
        }

        void* threadStartRoutine( void *pThis );
}

I want to create a thread from inside starter() to run threadStartRoutine(). I get compile time errors with regard to the third argument, which should take the address of the start routine.

What would be the correct way to call pthread_create() to create a new thread that starts executing threadStartRoutine() ?

I have come across articles online that say that most compilers do not allow non-static member functions to be invoked using pthread_create(). Is this true? What is the reason behind this?

I am compiling my program on Linux-x64 using G++.

Declare the threadStartRountine() as static :

static void* threadStartRoutine( void *pThis );

Otherwise, the type of threadStartRoutine() is:

void* (A::*)(void*)

which is not the type of function pointer that pthread_create() requires.

Do you have a reason for using pthreads? c++11 is here, why not just use that:

#include <iostream>
#include <thread>

void doWork()
{
   while(true) 
   {
      // Do some work;
      sleep(1); // Rest
      std::cout << "hi from worker." << std::endl;
   }
}

int main(int, char**)
{

  std::thread worker(&doWork);
  std::cout << "hello from main thread, the worker thread is busy." << std::endl;
  worker.join();

  return 0;
}

Just use a normal function as a wrapper. As hjmd says, a static function is probably the nicest kind of normal function.

If you insist on using the native pthreads interface, then you must provide an ordinary function as the entry point. A typical example:

class A
{
private:
    int starter()
    {
        pthread_t thr;
        int res = pthread_create(&thr, NULL, a_starter, this);
        // ...
    }
public:
    void run();
};

extern "C" void * a_starter(void * p)
{
    A * a = reinterpret_cast<A*>(p);
    a->run();
    return NULL;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM