构造函数内部的线程创建

时间:2015-06-19 05:49:57

标签: c++ multithreading static pthreads

所以,我正在使用C ++ 11而且我创建了一个类

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. 使用静态函数创建线程仅表示该函数的一个副本。
  2. 线程是在构造函数中创建的。我不知道如果我创建了多个C类对象会发生什么。
  3. 有人可以给我一个解决方法吗?

    解决了:谢谢你的帮助! 另外,一个非常好的建议是更喜欢未来用户使用std :: thread over pthread!

1 个答案:

答案 0 :(得分:2)

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

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

另一种解决方案是使用std::thread,这将使其更容易:

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