5

私は自分のスレッドへのポインタを持つこのvoid関数を持っています。コンパイルしようとすると、「コントロールが非 void 関数の終わりに達しました」という警告が表示されます。私が行った場合

void mythread (void *arg)

関数 i は、コンパイラが与える警告を解決しますが、次のような新しい警告が表示されます。

TA.c:50:2: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]

それで、return 0;「mythread」関数の最後に入れ、コンパイルします。しかし、これが正しいことかどうかはわかりませんか?

POSIX システム サービス プログラミングを学ぼうとしています。どうすればよいかわかりません。

アドバイス?キャスト引数 3 を入力してみる必要がありますか? プログラムをコンパイルして、警告をゼロにするにはどうすればよいですか?

#include <limits.h>
#include <pthread.h>
#include <stdio.h>

void *mythread (void *arg)
{   
    printf("This my Thread Maybe...\n");    
}

int main()
{
    pthread_t mythread_id;
    pthread_attr_t mythread_attr;
    size_t stack_size;
    int detachstate;

    pthread_attr_init (&mythread_attr);
    pthread_attr_getdetachstate(&mythread_attr, &detachstate);
    if(detachstate == PTHREAD_CREATE_DETACHED)
    {
        printf("Current Deteached state is Detached\n");
    }
    else
    {
        printf("Current Detached state is Joinable\n");
    }

    pthread_attr_setdetachstate (&mythread_attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_getdetachstate (&mythread_attr, &detachstate);

    if(detachstate == PTHREAD_CREATE_DETACHED)
    {
        printf("NEW DETACHED STATE is determined to be deteched\n");
    }
    else
    {
        printf("NEW DETACHED STATE is Determine to be Joinable\n");
    }

    pthread_attr_getstacksize (&mythread_attr, &stack_size);
    printf ("Default stack size is %d; minimum is %d\n", stack_size, PTHREAD_STACK_MIN);
    pthread_attr_setstacksize (&mythread_attr, PTHREAD_STACK_MIN*2);
    pthread_attr_getstacksize (&mythread_attr, &stack_size); 

    printf("NEW stack size is %d\n", stack_size);
    pthread_create (&mythread_id, &mythread_attr, mythread, 0);

    return 0;
}
4

3 に答える 3

7

関数の最後に追加return 0するのは正しいことです。関数のシグネチャは、値を返すようになっています。ライブラリ コードはpthread、戻り値が返されることを期待します。スレッド関数を間違ったシグネチャにキャストすると、未定義の動作が発生します。

コードは、 への呼び出し後に返される結果を確認できますpthread_join()0成功を意味するために使用できます。これで満足できない場合は、別の値を選択できます。

于 2013-08-12T22:55:32.340 に答える
3

pthread_createのドキュメントは、3 番目の引数としてa を受け取り、avoid *を返す関数へのポインターが必要であることを示しています。void *

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

voidこれが、関数が代わりに返されたときに「互換性のないポインター型」という警告が表示される理由ですvoid *-それは異なる型の関数ポインターになります。

あなたが述べたように、良い解決策は、関数がダミーvoid *を返すようにすることですreturn 0(または、おそらく混乱を避けるためにreturn NULL)、関数ポインターの型に互換性を持たせます。

于 2013-08-12T22:59:56.040 に答える
2

「それでは、 return 0; を「mythread」関数の最後に置き、コンパイルします。しかし、これが正しいことかどうかわかりませんか?アドバイス?私は POSIX システムを学ぼうとしている初心者プログラマーです。サービスプログラミング。」

はい、そうです。pthread_create は、1 つの void ポインターを取り、void ポインターを返すプロシージャーへのポインターを渡す必要があります。プロトタイプを見てください (man ページから)

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

start_routine のタイプを認識できますか?

于 2013-08-12T22:56:28.923 に答える