1

私は次のクラスを持っています:

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

        void* threadStartRoutine( void *pThis );
}

starter() 内からスレッドを作成して、threadStartRoutine() を実行したいと考えています。開始ルーチンのアドレスを取る必要がある 3 番目の引数に関して、コンパイル時エラーが発生します。

pthread_create() を呼び出して、 threadStartRoutine() の実行を開始する新しいスレッドを作成する正しい方法は何でしょうか?

私は、ほとんどのコンパイラが pthread_create() を使用して非静的メンバー関数を呼び出すことを許可していないという記事をオンラインで見つけました。これは本当ですか?この背後にある理由は何ですか?

G++ を使用して Linux-x64 でプログラムをコンパイルしています。

4

4 に答える 4

2

ラッパーとして通常の関数を使用するだけです。hjmdが言うように、静的関数はおそらく最も良い種類の正規関数です。

于 2012-08-28T13:26:16.203 に答える
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 に答える
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 に答える