8
class Scoreget{
    private:
        //some variables
    public:
        Scoreget(){
            //something here
        }

        void* basicgetscore(){
            //somthing here
        }

        void getscore(Scoreget s){
            pthread_t t;
            if(pthread_create(&t,NULL,s.basicgetscore,NULL)==-1){
               printf("Error 3\n");
               exit(3);
            }
            void *a;
            if(pthread_join(t,&a)==-1){
               printf("Error \n);
               exit(4);
            }
        }
};

関数を呼び出すために別のスレッドを実行しようとしています。これは、execl()の呼び出しを使用しているため、プログラムが停止するためです(Windowsを使用しているため、fork()を使用できません)。スレッド化とクラスの組み合わせは、私に苦労を与えています。

いくつかのグーグルから、私はその最後の関数をフレンドまたは静的にし、このポインターのある種を使用する必要があることを理解しました。私は自分の側で試してみましたが、ピースが合わないのです。エラータイプを変更することさえできません。今はイライラします。同じエラーが発生する:

Scoreget ::basicgetscoreをvoid*(Scoreget ::)()型からvoid *(*)(void *)型に変換できません

4

3 に答える 3

9

静的と宣言し、別のヘルパーメソッドを追加します。

static void* basicgetscore(void * object){
    return ((Scoreget *) object)->dobasicgetscore();
}

void * dobasicgetscore() // new helper method
{
    // do stuff here
    return NULL;
}

次のコマンドでpthreadを作成します。

if (pthread_create(&t,NULL,basicgetscore,&s) == -1) { ...

また、細心の注意を払ってください。このスレッドに一時変数のアドレスを指定します。この特定のケースでは、pthread_joinが同じ関数内にあるため安全ですが、スレッドが終了する前に関数から戻ると、スレッドを実行しているオブジェクトの割り当てが解除され、あらゆる種類の結果が生じる可能性があります。厄介な行動。関数を1)参照またはポインターを取得するか、2)を操作するように更新することを検討してくださいthis

于 2012-08-20T18:36:28.167 に答える
7

非静的メソッドをpthread_createに渡すことはできません

最も簡単な方法は、実行される静的メソッドを作成するbasicgetscore

このようなもの

static void *Scoreget::basicgetscore_starter(void *p) {
    Scoreget *t = (Scoreget *)p;
    t->basicgetscore();
}

pthread_create(&t,NULL,&Scoreget::basicgetscore_starter,(void *)&s);
于 2012-08-20T18:35:46.710 に答える
0

のスレッド関数として渡すには、非メンバー(静的)関数を定義する必要がありますpthread_create()。これはこの関数から期待される関数ポインタであるため、オブジェクトからの参照は役に立ちません。ただし、user args void *ポインターを使用して、オブジェクトインスタンスにポインターを渡すことができます。

于 2012-08-20T18:36:07.420 に答える