すべてのスレッドが完了した後で、メイン スレッドに特定の処理をさせたいですか?
そうでない場合は、メイン スレッドpthread_exit()
を返す (または呼び出すexit()
) 代わりに、単純に呼び出すことができます。
返された場合main()
は、暗黙的に を呼び出します (または、呼び出したかのように動作します) exit()
。これにより、プロセスが終了します。ただし、返される代わりにmain()
呼び出しが行われた場合pthread_exit()
、その暗黙的な呼び出しexit()
は発生せず、プロセスはすぐには終了しません。すべてのスレッドが終了したときに終了します。
あまりにも多くのクイックアンドダーティを取得することはできません.
違いを確認できる小さなサンプル プログラムを次に示します。-DUSE_PTHREAD_EXIT
コンパイラに渡して、すべてのスレッドが終了するまでプロセスが待機することを確認します。そのマクロを定義せずにコンパイルして、プロセスがトラック内のスレッドを停止することを確認します。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
static
void sleep(int ms)
{
struct timespec waittime;
waittime.tv_sec = (ms / 1000);
ms = ms % 1000;
waittime.tv_nsec = ms * 1000 * 1000;
nanosleep( &waittime, NULL);
}
void* threadfunc( void* c)
{
int id = (int) c;
int i = 0;
for (i = 0 ; i < 12; ++i) {
printf( "thread %d, iteration %d\n", id, i);
sleep(10);
}
return 0;
}
int main()
{
int i = 4;
for (; i; --i) {
pthread_t* tcb = malloc( sizeof(*tcb));
pthread_create( tcb, NULL, threadfunc, (void*) i);
}
sleep(40);
#ifdef USE_PTHREAD_EXIT
pthread_exit(0);
#endif
return 0;
}