2016-11-06 8 views
1

マルチスレッドの仕組みを理解しようとしています。私はこのコードの問題はthread_function1の実行が完了する前に、メインの実行が完了したことにある次のコードに `並行マルチスレッド

void handler(void *arg) 
{ 
    printf("Printf from cleanup handler: %s\n", (char*)arg); 
} 

void print(const char *msg) 
{ 
    printf("%7s: Pid=%d Tid:%lu\n", msg, getpid(), pthread_self()); 
} 

void* thread_function1(void *args) 
{ 
    printf("Received: %d\n", (int)args); 
    print("Thread"); 
    pthread_cleanup_push(handler, "hello"); 
    pthread_cleanup_pop(1); 
    printf("Thread Done\n");  
    return (void *) 0; 
} 

int main(void) 
{ 
    pthread_t tid1, tid2; 
    void *tret; 
    if(pthread_create(&tid1, NULL, thread_function1, (void *)1)) 
     exit(1); 
    if(pthread_create(&tid2, NULL, thread_function1, (void *)2)) 
     exit(1); 
// pthread_join(tid2, &tret); 
// pthread_join(tid1, &tret); 
} 

を書きました。両方のコメントが削除された場合は、thread 1の実行が完了した後にのみthread 2が実行されます。

私がしたいことは、thread 1thread 2が同時に実行され、mainが両方のスレッドの完了を待つ必要があります。

+2

スレッドは(ほんの些細な)作業量をしますか? 2番目のスレッドが作成される前に 'thread_function1'が終了することはありますか? –

+0

@WanderNauta質問を更新しました。それを見てください。これは、スレッド2は、スレッド1が完了した後にのみ実行されたことを意味し – Ibrahim

答えて

5

このコードの問題は、thread_function1が実行を完了する前にメインが実行を完了することです。

メインスレッドが終了すると、すべてのスレッドを含むプロセスが終了するからです。その代わりにメインスレッドからpthread_exit(0)を呼び出して、残りのスレッドが実行を継続し、メインスレッドが終了するようにすることができます。

コメントが両方とも削除された場合、スレッド1はスレッド1の実行が完了した後にのみ実行されます。

これは正しくありません。すなわちtid1tid2が同時に作成された後に実行されます(「同時実行」はハードウェア、スケジューリングポリシーなどによりますが、プログラムに関する限り、同時に実行されるものとみなされます)。 pthread_join()は、スレッドの実行順序を制御しません。それだけ、すなわちメインスレッドは、(あなたがそれらの2つの行をncomment場合)tid1を待つ第1およびを完了するためにtid2待つスレッドの完了を待つメインスレッド内の順序に影響を与えます。

+0

は、私が「ハロー:1 \ n個のprintfクリーンアップハンドラから:こんにちは\ nは受信:2 \ n個のprintfクリーンアップハンドラから受け取った」として出力を得ます。何か不足していますか? – Ibrahim

+0

注文は修正されていません。それを何回か繰り返して実行してください。おそらく、最初に「Received 2」が表示され、次に「Received 1」が表示されます。 – usr

+0

ありがとうございました。私はそれを複数回実行しようとしたが、それはあなたが言及したとおりに正確に動作します。ありがとうございました ! :) – Ibrahim

関連する問題