在构造函数中创建线程
Thread creation inside constructor
所以,我使用的是 C++11,我做了一个 class
Class C
{
private:
queue<std::int> s;
pthread_t x;
public:
C() {phthread_create(&x, NULL, d_q, NULL);
void log(int p); // pushes into q.
void* d_q(void* q); // this is a function which will pop s. assume s is thread safe.
}
问题出在 pthread_create(&x, NULL, d_q, NULL)
行。它给了我 Error: Reference to non-static member must be called.
我通过 pthread_t x static
解决了这个问题。但我不想这样做,原因有二:
- 创建带有静态函数的线程意味着只有 1 个函数副本。
- 线程是在构造函数中创建的。我不知道如果我创建多个 class C.
的对象会发生什么
有人可以给我一个解决方法吗?
已解决:感谢帮助!
此外,一个非常好的建议是 更喜欢 std::thread 而不是未来用户的 pthread!
至于您的问题,指向(非静态)成员函数的指针与指向成员函数的指针不同。非静态成员函数需要调用对象的实例。
有几种方法可以解决这个问题:如果你坚持使用 POSIX 线程函数,那么你可以制作一个 static
包装函数,将实例作为参数传递给线程,并在静态包装函数中使用传递的对象调用实际函数。
另一个解决方案是使用 std::thread
,这样会更容易:
class C
{
std::thread thread_;
...
public:
C() : thread_(&C::d_q, this) {}
...
void d_q() { ... }
};
所以,我使用的是 C++11,我做了一个 class
Class C
{
private:
queue<std::int> s;
pthread_t x;
public:
C() {phthread_create(&x, NULL, d_q, NULL);
void log(int p); // pushes into q.
void* d_q(void* q); // this is a function which will pop s. assume s is thread safe.
}
问题出在 pthread_create(&x, NULL, d_q, NULL)
行。它给了我 Error: Reference to non-static member must be called.
我通过 pthread_t x static
解决了这个问题。但我不想这样做,原因有二:
- 创建带有静态函数的线程意味着只有 1 个函数副本。
- 线程是在构造函数中创建的。我不知道如果我创建多个 class C. 的对象会发生什么
有人可以给我一个解决方法吗?
已解决:感谢帮助! 此外,一个非常好的建议是 更喜欢 std::thread 而不是未来用户的 pthread!
至于您的问题,指向(非静态)成员函数的指针与指向成员函数的指针不同。非静态成员函数需要调用对象的实例。
有几种方法可以解决这个问题:如果你坚持使用 POSIX 线程函数,那么你可以制作一个 static
包装函数,将实例作为参数传递给线程,并在静态包装函数中使用传递的对象调用实际函数。
另一个解决方案是使用 std::thread
,这样会更容易:
class C
{
std::thread thread_;
...
public:
C() : thread_(&C::d_q, this) {}
...
void d_q() { ... }
};