2016-06-29 24 views
0

私は学習pthreadと私はいくつかの質問があります。ここでlinuxでpthreadを使用する場合、pthread_joinは必須ですか?

が私のコードです:

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#define NUM_THREADS 10 

using namespace std; 

void *PrintHello(void *threadid) 
{ 
    int* tid; 
    tid = (int*)threadid; 
    for(int i = 0; i < 5; i++){ 
    printf("Hello, World (thread %d)\n", *tid); 
    } 
    pthread_exit(NULL); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    int t; 
    int* valPt[NUM_THREADS]; 

    for(t=0; t < NUM_THREADS; t++){ 
     printf("In main: creating thread %d\n", t); 
     valPt[t] = new int(); 
     *valPt[t] = t; 
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)valPt[t]); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 
    /* Last thing that main() should do */ 
    pthread_exit(NULL); 
} 

コードがうまく実行され、私はpthread_joinを呼び出すことはありません。だから私は知りたい、pthread_joinが必要ですか?


もう一つの問題は、次のとおりです。

に等しい
valPt[t] = new int(); 
*valPt[t] = t; 
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)valPt[t]); 

rc = pthread_create(&threads[t], NULL, PrintHello, &i); 
+0

あなたの2番目の質問に対する答え:ああ、それらの2つは完全に完全に違って見えます。私の推奨は 'reinterpret_cast (i)'です。なぜならこれはC++であり、質問にタグが付いているのでCではないからです。 –

+0

ここに、 'pthread_create'に値を渡す議論があります:http://stackoverflow.com/questions/8487380/how-to-cast-an-integer-to-void-pointer/8487738#8487738 –

+0

スレッドは"解放されました "あなたがそれに参加したとき、またはそれが分離されているときに終了したとき。それが分離されておらず、あなたがそれに加わらなければ、あなたはそれを漏らしています。 – immibis

答えて

1

それはないです。しかし、pthread_exit()またはpthread_join()のいずれかが必要です。 ここではpthread_exit()と呼ばれ、メインスレッドが終了した後でも子スレッドが実行を継続する理由を示しています。 子スレッドが実行を完了するまでメインスレッドが待機する必要がある場合は、pthread_join()を使用できます。

+0

並列スレッドの1つでexit()を呼び出すとmainが終了し、兄弟姉妹は「汚れた」死亡しますか? pthread_exit()を実行すると、親がなくなったことを知っていれば、正常に終了する可能性があります。もっと重要なのは、親がメインではないかもしれないということですか? – mckenzm

関連する問題