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 を使用できるかどうかを確認してください。何らかの理由でこれら 2 つのいずれも適切なオプションではない場合 (プロジェクトで boost の使用が許可されていない、古い C++ コンパイラを使用する必要があるなど)、pthread は適切な代替手段です。

この[特定のコンパイル]の問題を解決するにはどうすればよいですか?

あなたの実装は、C++ オブジェクト メンバー関数をフリー関数ポインターとして渡そうとします (これは機能しないはずです)。オブジェクト関数を呼び出す代わりに、フリー関数を作成する必要があります。

編集 [std::スレッドの例]:

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 に答える
0

グリーンフィールド プロジェクトに取り組んでおり、C++11 準拠のコンパイラが利用可能なプラットフォームで作業している場合は、std::thread. 名前空間が示すように、スレッドのサポートが標準ライブラリに組み込まれました。Google の「C++11 スレッド」で、多くのチュートリアル情報を入手できます。

于 2013-02-21T13:26:44.843 に答える