メインスレッドから新しいスレッドを開始したい。スレッドが終了するのを待ってから実行を再開したくないので、joinを使用できません。
基本的に必要なのはpthread_start(...)のようなものですが、見つかりません。
編集:
create_threadがスレッドを開始するように提案されたすべての回答として、問題は、以下の単純なコードでは機能しないことです。以下のプログラムの出力は「メインスレッド」です。サブスレッドが実行されていないようです。私が間違っているところはありますか?
Fedora 14GCCバージョン4.5.1でコンパイルおよび実行
void *thread_proc(void* x)
{
printf ("sub thread.\n");
pthread_exit(NULL);
}
int main()
{
pthread_t t1;
int res = pthread_create(&t1, NULL, thread_proc, NULL);
if (res)
{
printf ("error %d\n", res);
}
printf("main thread\n");
return 0;
}
スレッドを開始する関数はpthread_create
であり、pthread_join
ではありません。 pthread_join
を使用するのは、待機して再同期する準備ができたときだけです。スレッドを切り離す場合は、それを使用する必要はまったくありません。別のスレッドから参加することもできます。
終了する前に(exit
を呼び出すか、main
から戻ることにより)、他のスレッドが実行されていないことを確認する必要があります。これを行う1つの方法(唯一ではありません)は、作成したすべてのスレッドに参加することです。
コードの動作はスケジューラーによって異なります。おそらくメインプログラムは、作成されたスレッドのprintfが実行される前に終了します。 main()の最後にある単純なsleep(some_seconds)によって、スレッド出力が表示されることを願っています:)
join
呼び出しは、スレッドが終了して終了するのを待ちます。
子スレッドの実行中にメインスレッドの実行を継続する場合は、join
を呼び出さないでください。子スレッドはメインスレッドと同時に実行されます。
Detached属性をonに設定してスレッドを作成するだけです。これを実現するには、スレッドの作成後にpthread_detach
を呼び出すか、スレッドの作成前にpthread_attr_setdetachstate
を呼び出すことができます。
スレッドが切り離されると、親スレッドはそれを待つ必要がなく、その戻り値をフェッチできません。
man()の最後でpthread_exitを呼び出す必要があります。これにより、mainは他のスレッドの開始と終了を待機します。または、pthread_joinを明示的に呼び出して、新しく作成されたスレッドを待機することもできます
それ以外の場合、mainが戻ると、プロセスが強制終了され、プロセスが作成するすべてのスレッドが強制終了されます。
create itすると、スレッドは自動的に開始されます。
pthread_createを呼び出す必要はありませんか?
static void *thread_body(void *argument) { /* ... */ }
int main(void) {
pthread_t thread;
pthread_create(&thread, NULL, thread_body, NULL);
/* ... */