在构造函数中创建线程

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. 创建带有静态函数的线程意味着只有 1 个函数副本。
  2. 线程是在构造函数中创建的。我不知道如果我创建多个 class C.
  3. 的对象会发生什么

有人可以给我一个解决方法吗?

已解决:感谢帮助! 此外,一个非常好的建议是 更喜欢 std::thread 而不是未来用户的 pthread!

至于您的问题,指向(非静态)成员函数的指针与指向成员函数的指针不同。非静态成员函数需要调用对象的实例。

有几种方法可以解决这个问题:如果你坚持使用 POSIX 线程函数,那么你可以制作一个 static 包装函数,将实例作为参数传递给线程,并在静态包装函数中使用传递的对象调用实际函数。

另一个解决方案是使用 std::thread,这样会更容易:

class C
{
    std::thread thread_;
    ...
public:
    C() : thread_(&C::d_q, this) {}
    ...
    void d_q() { ... }
};