我是C ++的新手。
我有一个类,我想在类的函数中创建一个线程。并且该线程(函数)也将调用并访问类函数和变量。 一开始我尝试使用Pthread,但只在类外工作,如果我想访问类函数/变量,我得到了一个超出范围的错误。 我看一下Boost / thread但是不可取,因为我不想在我的文件中添加任何其他库(出于其他原因)。
我做了一些研究,找不到任何有用的答案。 请举一些例子来指导我。非常感谢你!
尝试使用pthread(但我不知道如何处理我上面提到的情况):
#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;
}
答案 0 :(得分:12)
您可以将静态成员函数传递给pthread,并将对象的实例作为参数传递。这个成语是这样的:
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
}
这是一个pthread示例。你可以很好地调整它以使用std :: thread。
答案 1 :(得分:8)
#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();
}