简体   繁体   中英

How to create a thread inside a class function?

I am very new to C++.

I have a class, and I want to create a thread inside a class's function. And that thread(function) will call and access the class function and variable as well. At the beginning I tried to use Pthread, but only work outside a class, if I want to access the class function/variable I got an out of scope error. I take a look at Boost/thread but it is not desirable because of I don't want to add any other library to my files(for other reason).

I did some research and cannot find any useful answers. Please give some examples to guide me. Thank you so much!

Attempt using pthread(but I dont know how to deal with the situation I stated above):

#include <pthread.h>

void* print(void* data)
{
    std::cout << *((std::string*)data) << "\n";
    return NULL; // We could return data here if we wanted to
}

int main()
{
    std::string message = "Hello, pthreads!";
    pthread_t threadHandle;
    pthread_create(&threadHandle, NULL, &print, &message);
    // Wait for the thread to finish, then exit
    pthread_join(threadHandle, NULL);
    return 0;
}

You can pass a static member function to a pthread, and an instance of an object as its argument. The idiom goes something like this:

class Parallel
{
private:
    pthread_t thread;

    static void * staticEntryPoint(void * c);
    void entryPoint();

public:
    void start();
};

void Parallel::start()
{
    pthread_create(&thread, NULL, Parallel::staticEntryPoint, this);
}

void * Parallel::staticEntryPoint(void * c)
{
    ((Parallel *) c)->entryPoint();
    return NULL;
}

void Parallel::entryPoint()
{
    // thread body
}

This is a pthread example. You can probably adapt it to use a std::thread without much difficulty.

#include <thread>
#include <string>
#include <iostream>

class Class
{
public:
    Class(const std::string& s) : m_data(s) { }
    ~Class() { m_thread.join(); }
    void runThread() { m_thread = std::thread(&Class::print, this); }

private:
    std::string m_data;
    std::thread m_thread;
    void print() const { std::cout << m_data << '\n'; }
};

int main()
{
    Class c("Hello, world!");
    c.runThread();
}

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