1

我有以下课程:

class A
{
    private:
        int starter()
        {
             //TO_DO: pthread_create()
        }

        void* threadStartRoutine( void *pThis );
}

我想从 starter() 内部创建一个线程来运行 threadStartRoutine()。我得到关于第三个参数的编译时错误,它应该采用启动例程的地址。

调用 pthread_create() 以创建开始执行 threadStartRoutine() 的新线程的正确方法是什么?

我在网上看到一些文章说大多数编译器不允许使用 pthread_create() 调用非静态成员函数。这是真的?这背后的原因是什么?

我正在使用 G++ 在 Linux-x64 上编译我的程序。

4

4 回答 4

2

声明threadStartRountine()static

static void* threadStartRoutine( void *pThis );

否则,类型threadStartRoutine()为:

void* (A::*)(void*)

这不是所需的函数指针类型pthread_create()

于 2012-08-28T13:22:53.943 回答
2

你有使用 pthread 的理由吗?c++11 就在这里,为什么不直接使用它:

#include <iostream>
#include <thread>

void doWork()
{
   while(true) 
   {
      // Do some work;
      sleep(1); // Rest
      std::cout << "hi from worker." << std::endl;
   }
}

int main(int, char**)
{

  std::thread worker(&doWork);
  std::cout << "hello from main thread, the worker thread is busy." << std::endl;
  worker.join();

  return 0;
}
于 2012-08-28T13:24:06.410 回答
2

只需使用普通函数作为包装器。正如 hjmd 所说,静态函数可能是最好的普通函数。

于 2012-08-28T13:26:16.203 回答
0

如果你坚持使用原生 pthreads 接口,那么你必须提供一个普通函数作为入口点。一个典型的例子:

class A
{
private:
    int starter()
    {
        pthread_t thr;
        int res = pthread_create(&thr, NULL, a_starter, this);
        // ...
    }
public:
    void run();
};

extern "C" void * a_starter(void * p)
{
    A * a = reinterpret_cast<A*>(p);
    a->run();
    return NULL;
}
于 2012-08-28T13:30:50.403 回答