10
anisha@linux-y3pi:~> g++ conditionVarTEST.cpp -Wall

conditionVarTEST.cpp: In function ‘int main()’:
conditionVarTEST.cpp:33:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:33:53: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
conditionVarTEST.cpp:34:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:34:53: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’

行番号33は次のとおりです。

pthread_create (&A, NULL, (void *) &functionA, NULL);

の宣言functionAはこれです:

void functionA (void*);


その定義は次のとおりです。

void functionA (void* argA)
{
    while (1)
    {
        pthread_mutex_lock (&mutexA);

        if (count < 0)
        {
            pthread_cond_wait (&conditionVariableA, &mutexA);
        }
        else
        {
            // Do something.
            std :: cout << "\nTime to enjoy!";
        }
        pthread_mutex_unlock (&mutexA);
    }
}
4

4 に答える 4

17

マニュアルページを見ると、関数の引数が次のようになっていることがわかります。

void *(*start_routine) (void *)

つまり、1つのvoid *引数を取り、を返す関数へのポインタvoid *です。

エラーを取り除くには、関数を変更してreturnを返しvoid *、型キャストせずに渡します。return NULL値を気にしない場合は、スレッド関数からの戻りは簡単です。

于 2012-08-01T11:25:07.897 に答える
4

(void *) &functionAfunctionAタイプの 関数ポインタをvoid (*)(void*)simpleにキャストしますvoid*。後者を最初に再度変換することはできないため、コンパイラはエラーを報告します。これが、C スタイルのキャストを使用すべきでない理由の 1 つです。

pthread_create (&A, NULL, functionA, NULL);代わりに使用してください。

また、スレッド関数の戻り値の型はvoid*ではなく にする必要がありvoidます。に変更void functionA(void*)void* functionA(void*)ます。

于 2012-08-01T11:23:20.333 に答える
4

使用する

pthread_create (&A, NULL, functionA, NULL); 

キャストの代わりに。

また、 pthread_create に渡すために使用する関数は を返す必要があるvoid*ため、後で問題が発生しないように、関数のシグネチャを変更してこれに対応することを検討してください。

于 2012-08-01T11:27:39.760 に答える
3

また、C++ コンパイラを使用しているため、pthread_create は C 関数を想定しているため、C バインドのある関数を使用する必要があります。

extern "C" void* functionA (void*);

C++ と C は、現在のプラットフォームで同じ呼び出し規則を使用している可能性がありますが、これが他のプラットフォームで当てはまる、または将来そうなるという保証はありません。

于 2012-08-01T11:39:58.030 に答える