2

首先,thread和pthread有什么区别。我应该在 C++ 中使用什么。

我正在尝试使用 pthread,如下所示:

//MyPatcher.h

class MyPatcher
{
   public:
     void createThread();

   private:
     void * Checkingdata(void *arg);
}

// MyPatcher.cpp
#include "MyPatcher.h"
#include <pthread.h>
using namespace std;

void MyPatcher::createThread()
{
  pthread_t threadDataReading;

  if(pthread_create(&threadDataReading, NULL, Checkingdata, NULL))  
    printf("Could not create thread\n");

  if(pthread_join(threadReadingGps, NULL))  
    printf("Could not join thread\n");
}

void * MyPatcher::Checkingdata(void *arg)
{
  return NULL;
}

但我遇到了这些问题:

./MyPatcher.cpp:71:73: error: argument of type 'void* (SampleApp::MyPatcher::)(void*)' does not match 'void* (*)(void*)'

我怎么解决这个问题?

// 然后我也尝试使用线程:

//MyPatcher.h

    class MyPatcher
    {
       public:
         void createThread();

       private:
         void Checkingdata();
    }

    // MyPatcher.cpp
    #include "MyPatcher.h"
    #include <thread>
    using namespace std;

    void MyPatcher::createThread()
    {
      pthread_t threadDataReading(Checkingdata);

      threadDataReading.join();
    }

    void MyPatcher::Checkingdata()
    {

    }

但我遇到了这个问题:错误:没有匹配函数调用'std::thread::thread()'

4

4 回答 4

4

首先,thread和pthread有什么区别。

pthread 是一个线程库实现,可以用 C、C++ 和其他语言访问。

thread 是 std::thread,一个 C++ 对象(C++11 的一部分)——至少我认为你所说的线程就是这个意思。

我应该在 C++ 中使用什么。

如果您有支持它的编译器,请使用 std::thread。否则,看看你是否可以使用 boost::thread。如果出于某种原因这两个都不是好的选择(您的项目不允许使用 boost,您必须使用旧的 C++ 编译器等),那么 pthread 是一个不错的选择。

我该如何解决这个[特定编译]问题?

您的实现尝试将 C++ 对象成员函数作为自由函数指针传递(这应该不起作用)。您应该创建一个自由函数来调用您的对象函数。

编辑 [std::thread 示例]:

class MyPatcher
{
   public:
     void createThread();

   private:
     void Checkingdata();
}

// MyPatcher.cpp
#include "MyPatcher.h"
#include <thread>
#include <functional> // std::bind
using namespace std;

void MyPatcher::createThread()
{
    // std::bind -> return a functor with signature void functor(void);
    std::thread threadDataReading(std::bind(&MyPatcher::Checkingdata, this));

    threadDataReading.join();
}

void MyPatcher::Checkingdata()
{
}
于 2013-02-21T13:31:45.997 回答
1

pthread_create()需要一个普通的 C 风格的函数指针。this你传递给它的是一个成员函数指针,如果没有(通常是隐式的)参数就不能调用它。

您可以通过定义一个普通函数的小包装器来使其工作:

static void * Checkingdata(void *arg)
{
  static_cast<MyPatcher*>(arg)->CheckingData();
}

pthread_create()然后你将该函数以及你的类实例的地址作为最后一个参数传递给(而你有 NULL)。

于 2013-02-21T13:22:53.120 回答
1

您传递给pthread_create的函数不能是成员函数。您可以通过创建静态函数来解决此问题。由于您将 NULL 作为参数传递,因此我将重用void *arg来传递对象:

 static void * Checkingdata(void *self)
 {
      MyPatcher *me = reinterpret_cast<MyPatcher*>(self);
      me->DoCheckingData();
 }

 void * DoCheckingdata();   // Does the things you want to do. 

原因是线程函数没有“this-pointer”作为隐藏参数传递给成员函数。

还有其他替代方案,例如 using std::thread,它将std::function对象作为参数 - 或者可以转换为td::function.

于 2013-02-21T13:27:19.080 回答
0

如果您正在开发一个绿地项目,并且您正在使用兼容 c++11 的编译器的平台上工作,我强烈建议您考虑使用std::thread. 正如命名空间所暗示的,线程支持现在已内置到标准库中。谷歌“C++11 线程”获取大量教程信息。

于 2013-02-21T13:26:44.843 回答