1

私は以下を使おうとしています:

pthread_create(&searchThread [i]、&threadAttribs [i]、DoStuff、&ParallelParams [i]);

DoStuffが静的である場合、コンパイルされますが、DoStuffが含まれるクラスの一部であるメソッドまたは変数にはアクセスできません。ただし、DoStuffを非静的メソッドとして保持し、他のすべてにアクセスできるようにすると、クラス私は次のコンパイラエラーを受け取ります:

エラー:タイプ'void *(MyClass ::)(void *)'の引数が'void *( )(void)'と一致しません

ここで、エラーはDoStuff引数と、それがメンバー関数であるという事実を参照しているようです。

DoStuffメソッドでMyClassのすべてにアクセスできるようにする非静的メソッドを渡すことができるという希望はありますか?

ありがとう!

4

1 に答える 1

5

pthreads はvoid* startfunc(void*)署名を期待し、非静的メンバー関数には隠しthisポインターがあるため、それを回避する必要があります。簡単な方法は、クラスに静的ヘルパー関数を作成することです。それを開始関数として使用し、アクセスするオブジェクトを 4 番目の (データ) パラメーターに渡します。そのようなもの:

class Foo
{
    public:

        void *runThis(void)
        {
            std::cout << "Thread accessing this member function" << std::endl;
            return 0;
        }

        static void *runHelper(void *classRef)
        {
            return ((Foo *)classRef)->runThis();
        }
};

int main(int argc, char *argv[])
{
    Foo foo;
    pthread_t t;

    pthread_create(&t, NULL, &Foo::runHelper, &foo);

    pthread_join(t, NULL);
}

上記のようなものになるが、より一般的な、より洗練されたテンプレートメソッドがいくつかあります。

于 2012-06-25T21:41:03.940 に答える