web-dev-qa-db-ja.com

pthread-joinを呼び出さずに新しいスレッドの実行を開始するにはどうすればよいですか?

メインスレッドから新しいスレッドを開始したい。スレッドが終了するのを待ってから実行を再開したくないので、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;
}
14
Ohad Horesh

スレッドを開始する関数はpthread_createであり、pthread_joinではありません。 pthread_joinを使用するのは、待機して再同期する準備ができたときだけです。スレッドを切り離す場合は、それを使用する必要はまったくありません。別のスレッドから参加することもできます。

終了する前に(exitを呼び出すか、mainから戻ることにより)、他のスレッドが実行されていないことを確認する必要があります。これを行う1つの方法(唯一ではありません)は、作成したすべてのスレッドに参加することです。

18
James Kanze

コードの動作はスケジューラーによって異なります。おそらくメインプログラムは、作成されたスレッドのprintfが実行される前に終了します。 main()の最後にある単純なsleep(some_seconds)によって、スレッド出力が表示されることを願っています:)

6
user396672

join呼び出しは、スレッドが終了して終了するのを待ちます。

子スレッドの実行中にメインスレッドの実行を継続する場合は、joinを呼び出さないでください。子スレッドはメインスレッドと同時に実行されます。

3
Adrien Plisson

Detached属性をonに設定してスレッドを作成するだけです。これを実現するには、スレッドの作成後にpthread_detachを呼び出すか、スレッドの作成前にpthread_attr_setdetachstateを呼び出すことができます。

スレッドが切り離されると、親スレッドはそれを待つ必要がなく、その戻り値をフェッチできません。

2

man()の最後でpthread_exitを呼び出す必要があります。これにより、mainは他のスレッドの開始と終了を待機します。または、pthread_joinを明示的に呼び出して、新しく作成されたスレッドを待機することもできます

それ以外の場合、mainが戻ると、プロセスが強制終了され、プロセスが作成するすべてのスレッドが強制終了されます。

1
cheng yang

create itすると、スレッドは自動的に開始されます。

0
Klas Lindbäck

pthread_createを呼び出す必要はありませんか?

static void *thread_body(void *argument) { /* ... */ }

int main(void) {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_body, NULL);
    /* ... */