pthread function from a class

前端 未结 9 1083
天命终不由人
天命终不由人 2020-11-22 01:00

Let\'s say I have a class such as

class c { 
    // ...
    void *print(void *){ cout << \"Hello\"; }
}

And then I have a vector of c

9条回答
  •  星月不相逢
    2020-11-22 01:43

    The above answers are good, but in my case, 1st approach that converts the function to be a static didn't work. I was trying to convert exiting code to move into thread function but that code had lots to references to non-static class members already. The second solution of encapsulating into C++ object works, but has 3-level wrappers to run a thread.

    I had an alternate solution that uses existing C++ construct - 'friend' function, and it worked perfect for my case. An example of how I used 'friend' (will use the above same example for names showing how it can be converted into a compact form using friend)

        class MyThreadClass
        {
        public:
           MyThreadClass() {/* empty */}
           virtual ~MyThreadClass() {/* empty */}
    
           bool Init()
           {
              return (pthread_create(&_thread, NULL, &ThreadEntryFunc, this) == 0);
           }
    
           /** Will not return until the internal thread has exited. */
           void WaitForThreadToExit()
           {
              (void) pthread_join(_thread, NULL);
           }
    
        private:
           //our friend function that runs the thread task
           friend void* ThreadEntryFunc(void *);
    
           pthread_t _thread;
        };
    
        //friend is defined outside of class and without any qualifiers
        void* ThreadEntryFunc(void *obj_param) {
        MyThreadClass *thr  = ((MyThreadClass *)obj_param); 
    
        //access all the members using thr->
    
        return NULL;
        }
    

    Ofcourse, we can use boost::thread and avoid all these, but I was trying to modify the C++ code to not use boost (the code was linking against boost just for this purpose)

提交回复
热议问题