2016-05-26 6 views
-1

すべてのスレッドの要約(つまり、スレッドグループの総計)を印刷しようとしていたとき、私は立ち往生しました。スレッドを完了した後でプロセスを続行するには?

以下のCコードは、チケットを販売するエージェントをシミュレートする1​​0のスレッドを実行します。 &を実行した後(つまり、すべてのチケットが販売された後)、エージェントのリストとそのエージェントが販売したチケットの番号を印刷します。しかし、メインプロセスは、pthread_exit(NULL)(前のコメントでマークされています)に当たってすぐに終了し、コードはmainに戻りません。ここで総計が出力されます(このブロックにはコメントも表示されます) 。

コードに何が間違っているか誰にでも教えてください。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <pthread.h> 
#include <semaphore.h> 

struct ThreadArgs { 
    int thNum; 
    int *numTickets; 
    int *soldTickets; 
    sem_t *lock; 
}; 

void *SellTickets(void *th) { 
    struct ThreadArgs *thArgs; 
    int sleepTime; 

    thArgs = th; 

    while (1) { 
     sleepTime = rand(); 

     if (sleepTime % 2) { 
      usleep(sleepTime % 1000000); 
     } 

     sem_wait(thArgs->lock); 

     if (*thArgs->numTickets == 0) { 
      break; 
     } 

     printf("There are %3d ticket(s). Agent %d sold a ticket.\n", *thArgs->numTickets, thArgs->thNum); 
     (*thArgs->numTickets)--; 
     sem_post(thArgs->lock); 
     (*thArgs->soldTickets)++; 
    } 

    sem_post(thArgs->lock); 
    pthread_exit(NULL); 
} 

void runThreads(int numAgents, int numTickets, int soldTickets[]) { 
    struct ThreadArgs thArgs[numAgents]; 
    int agent; 
    pthread_t th[numAgents]; 
    sem_t lock; 

    sem_init(&lock, 1, 1); 

    for (agent = 0; agent < numAgents; agent++) { 
     thArgs[agent].thNum = agent; 
     thArgs[agent].soldTickets = &soldTickets[agent]; 
     thArgs[agent].numTickets = &numTickets; 
     thArgs[agent].lock = &lock; 
     pthread_create(&th[agent], NULL, SellTickets, &thArgs[agent]); 
    } 
    // when debugging, the process terminates here 
    pthread_exit(NULL); 
} 

int main() { 
    int agent, numAgents, numTickets, soldTickets[10]; 

    numAgents = 10; 
    numTickets = 150; 

    for (agent = 0; agent < numAgents; agent++) { 
     soldTickets[agent] = 0; 
    } 

    runThreads(numAgents, numTickets, soldTickets); 

    // the process never executes the following block  
    for (agent = 0; agent < numAgents; agent++) { 
     printf("Agent %d sold %d ticket(s).\n", agent, soldTickets[agent]); 
    } 

    return 0; 
} 
+0

なぜメインスレッドで 'pthread_exit()'しますか? – EOF

+0

@ EOF:あなたの方法を試しました。 'return'文の直前に' pthread_exit() '行を' main'に持ってきました。しかし、今回はスレッドがまったく実行されませんでした。 forループ(すべてのエージェントのチケットがゼロ)とセグメント分割エラーが出力されます。 – ssd

+0

私はあなたが*試みることができる方法を教えていませんでした。私は*なぜ*あなたがしていることをやっているのかを尋ねていた。あなたのコードは私には意味がありません。 – EOF

答えて

1

pthread_exit()は、「メイン」スレッドであってもスレッドを終了します。

main()が終了すると、他のすべてのスレッドも終了します。

"メイン"スレッドは最終的なロギングを行う予定であるため、生成されたすべてのスレッドが終了するまで待機する必要があります。 pthread_create()によって返されるすべてのpthread-IDのpthread_join()を呼び出すループによって

 pthread_exit(NULL); 

への呼び出しを置き換えるrunThreads()でこれを達成するために

また、あなたが例えば失敗コールのを示すような任意の関連情報を、返すすべての関数呼び出しのために行う必要があるとして、すべてのpthread*()呼び出しにエラーチェックを追加します。

関連する問題