2012-02-09 1 views
2
#include <pthread.h> 
#include <stdio.h> 

void* printHello (void* threadId) 
{ 
    pthread_t *my_tid = (pthread_t *)threadId; 
    printf ("\nIn `printHello()`: thread id %ld", (long)*my_tid); 
    pthread_exit (NULL); 
} 

int main() 
{ 
    pthread_t  arrayOfThreadId [5]; 
    int     returnValue; 
    unsigned int iterate; 

    for (iterate = 0; iterate < 5; iterate++) 
    { 
     if (returnValue = pthread_create (&arrayOfThreadId [iterate], 
            NULL, 
            printHello, 
            (void*) &arrayOfThreadId [iterate]) != 0) 
     { 
      printf ("\nerror: pthread_create failed with error number %d", returnValue); 
     } 
     else 
     { 
      printf ("\nIn `main()`: creating thread %ld", arrayOfThreadId [iterate]); 
     } 
    } 

    printf ("\nBefore `return 0;` in `main()`"); 
    pthread_exit (NULL); 
    return 0; 
} 

出力:スレッドID(メインで異なる)とするstart_routine() - のPthread

In 

`main()`: creating thread 139683073914640 
In `main()`: creating thread 139683065521936 
In `main()`: creating thread 139683057129232 
In `main()`: creating thread 139683048736528 
In `main()`: creating thread 139683040343824 
Before `return 0;` in `main()` 
In `printHello()`: thread id 140735115959408 
In `printHello()`: thread id 4195680 
In `printHello()`: thread id 0 
In `printHello()`: thread id 0 
In `printHello()`: thread id 139683073914640 

はなぜthreadIDsが異なるのですか?

ここにいくつか不明点があります。私は誤って間違ってしまったようです。

答えて

4

あなたはthreadIdのアドレスを渡していますが、そのアドレスをpthread_tにキャストしているので、arrayOfThreadId内の要素のアドレスをpthread_tのように扱います。

代わりにこれを行います。

void* printHello (void* threadId) 
{ 
    pthread_t *my_tid = threadId; 
    printf ("\nIn `printHello()`: thread id %ld\n", (long)*my_tid); 

をまた確認して、あなたのmain()のすべてのスレッドが終了するまで終了し、そうでないあなたは、スレッドがそれにつつく前に、配列が破壊されたリスクはありません。

+0

'pthread_t * my_tid = threadId;'の結果は 'error: 'void *'から 'pthread_t *'への無効な変換です –

+0

答えを訂正するには、' pthread_t * my_tid =(pthread_t *)threadId; ' –

+0

とにかく、問題は依然として続きます。 –

関連する問題