なぜ do が戻り値のpthread_join
2 番目の引数としてとられるvoid**
のに対しpthread_exit
、戻り値が与えられた には戻り値の引数が として含まれているのか理解できませんvoid*
。
2 に答える
pthread_join はスレッドが終了するのを待ち、pthread_exit からの結果の値は *value_ptr に格納されます。結果を無視したい場合は、value_ptr に NULL を渡すことができます。これは、ポインターを変数に渡すことによって参照渡しをシミュレートする C の一般的な方法です。C での参照渡しを参照してください。
pthread_join は、成功すると関数の戻り値として 0 を返します。スレッドが結合されていることがわかり、*value_ptr から値にアクセスできます。
void *value = NULL;
if (pthread_join(thread, &value) == 0) {
// thread has ended, and the exit value is available in
// the value variable
}
基本的に、pthread_join()
次の 2 つの情報を返します。
- 成功/失敗の表示
- スレッドが返したもの (タイプは
void*
)
C では、関数が 2 つの個別の値を「返す」一般的な方法は、関数に通常どおりこれらの値の 1 つを返させ、呼び出し元がその場所へのポインターで渡す、呼び出し元によって提供された場所で別の値を「返す」ことです。 . だからpthread_join()
:
- 関数の値として成功/失敗を返します
- スレッドの
void*
結果を、呼び出し元が渡した、呼び出し元が提供した場所に返しますvoid**
。
pthread_join()
の場合、発信者が提供する場所はオプションであることに注意してください。呼び出し元がその結果に関心がない場合は、ID に NULL を渡すことができます。発信者が提供する場所をオプションにすることは一般的であり、決して普遍的な慣用句ではありません。
pthread_exit()
その引数は関数の結果void**
ではないため、引数としてa を使用する必要はありません。したがって、単純に値を直接受け取ることができます。