0

私はgccを使用してLinux上のcでプログラムを書いています。そのsleepステートメントを使用していない場合は、「スレッドが作成されました」を2、3、または4回ランダムに出力します。誰かが私にこの振る舞いを説明できますか?//次のコードは単なるサンプルです。文字列を出力するためだけにスレッドを作成するのはあまり役に立ちません:)

void* makeRequest(void* arg) {
    printf("Thread created\n");
}

int main(){
   pthread_t thr[10];
   for(i=0; i<3; i++){  
       pthread_create(&thr[i], 0, makeRequest, &i);
       sleep(1);
    }
 }

pspthread.hとコンパイルオプション-pthreadを含めました

4

4 に答える 4

4

作成したすべてのスレッドに参加し、mainプロセス全体を終了するときに終了する必要があります。

mainまたは、で終了することもできますpthread_exit

于 2012-12-28T13:39:44.133 に答える
2

他の発言に加えて、

 pthread_create(&thr[i], 0, makeRequest, &i);

iはローカル変数であるため、正しくありません。pthread_create&iへのすべての呼び出しで同じポインタが使用されます。

通常、データポインタをスレッドルーチンに作成する必要があります。ここで、スレッドルーチンはmakeRequest静的ポインタまたは一意のポインタ(スレッドごとに一意)のいずれかです。実際には、それをいくつかのmalloc-edメモリへのポインタにします。

より良い方法は、いくつかを宣言してstruct my_thread_data_st、それをヒープに一意に割り当てることです。

struct my_thread_data_st* td = malloc(sizeof(struct my_thread_data_st));
if (!td) perror("malloc td"), exit(EXIT_FAILURE);
memset (td, 0, sizeof(struct my_thread_data_st));
// fill td appropriately, then
pthread_create(&thr[i], 0, makeRequest, td);

intまたは、たとえば-sの配列を使用することもできます。たとえばint num[4];、適切に初期化してから、pthread_create(&thr[i], 0, makeRequest, &num[i]);

もちろん、tdがヒープに割り当てられている場合は、適切なタイミングで、たとえばスレッドが終了した後(たとえば、pthread_joinmallocを実行した後)に忘れないでください。また、 BoehmのGCに興味があり、代わりに使用することもできます(その後、メモリを解放することを気にしないでください。GCがそれを実行します)。freeGC_mallocmalloc

スレッドが共有データにアクセスしている場合は、[グローバルまたは静的]ミューテックスを使用してアクセスをシリアル化する必要があります(pthread_mutex_lock&を使用pthread_mutex_unlock

pthread_join終了する前に、すべてのスレッドを呼び出すことを忘れないでください。たとえば、から戻るなどですmain

いくつかのpthreadチュートリアル高度なLinuxプログラミングに関する本を読むことをお勧めします。

于 2012-12-28T17:00:18.383 に答える
1

必要なもの:

for(i = 0; i < 3; i++)
{
   pthread_join(thr[i], NULL);
}

あなたが書いたように、メインが戻ってプロセス全体を終了し、スレッドを強制終了する前に、スレッドが終了するのを待つものは何もありません。

于 2012-12-28T13:39:58.817 に答える
1

最初にjoinを使用します。使用しない場合は送信する必要&iはありません。

「スレッド作成」を2、3、または4回ランダムに印刷します。

メインスレッドが死ぬと、すべての子スレッドも死にます。だからあなたは参加を待つ必要があります。

無作為に。:スレッドコンテキストでどちらがチャンスを得るかわからないため。メインスレッドまたは子スレッドの場合があります。

for(i=0; i<3; i++){  
       pthread_create(&thr[i], 0, makeRequest, &i);   
}

for(i=0; i<3; i++){  
       pthread_join(thr[i], NULL);
}

-pthreadでは-lpthread なく2番目の使用

$ gcc file.c -lpthread -o output      

編集済み

-pthread 「pthreads」ライブラリを使用したマルチスレッドのサポートを追加します。このオプションは、プリプロセッサとリンカの両方にフラグを設定します。JensGustedtコメント

-pthreadと-lpthreadの違い

于 2012-12-28T13:43:34.747 に答える