4

cでは、次のようなスレッドを作成します。

void * run(void * arg){
    printf("hello world\n");
}

int main(){
    pthread_t thread;
    int a = pthread_create(&thread, NULL, run, (void*)0);
}

しかし、runを次のように宣言すると機能しません

void run(){}

一方、(void *)のパラメータでキャストするとpthread_create正常に動作します。したがって、戻り型が。の関数のみを受け入れます(void *)

なんで?

ありがとう !

4

3 に答える 3

5

void *スレッドライブラリはそのような戻り値を期待し、スレッドの終了後に指定された場所にそれを格納するため、スレッド関数は戻るように宣言する必要がありpthread_join()ます。

スレッドの戻り値が必要ない場合は、return 0;

于 2012-05-04T23:31:34.693 に答える
4

私のシステムでは、次のようにman pthread_create述べています。

戻り値の場合、その結果は、の戻り値を終了ステータスとして使用して、start_routineへの暗黙の呼び出しがあったかのようになります。pthread_exit()start_routine

この戻り値は、次のpthread_join()関数を介して利用できます。

pthread_join()NULL以外の引数を使用して成功した呼び出しから戻ると、終了スレッドによってvalue_ptr渡された値は、によって参照される場所に格納されます。pthread_exit()value_ptr

于 2012-05-04T23:30:40.733 に答える
0

なぜだめですか?定義上、スレッドには独自のスタックがあるため、スレッドを呼び出したり、スレッドから返したりすることはできません。ただし、通常は、初期データをスレッドに通知できると便利です。また、スレッドの終了時に信号を送信することも役立つ場合があります。OS設計者はそれを知っていたので、起動時に一定量のデータをスレッドスタックにコピーし、終了時にシグナルを送信することを許可しました。OSスレッド呼び出しは言語に依存しない必要があるため、1つのマシン幅の単語を普遍的に選択できます。Cは、これをvoid *として表示します。これは、おそらく、タイプのない単なる値であることを示しています。

于 2012-05-05T10:47:00.997 に答える