2015-10-31 74 views
-1

使用的建議在這裏找到(How to spawn n threads?)我寫了下面:在for循環創建線程:通過同一所有線程的「i」值

int threads_count = 2; 
pthread_t *threads = calloc(threads_count, sizeof(pthread_t)); 
int j; 
for(j = 0; j < threads_count; j++) { 
    int thread_number = j; 
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) &thread_number); 
} 

my_func的有關部分,例如:

void *my_func(void *thread) { 
    int *thread_no = (int *) thread; 
    pthread_t thread_id = pthread_self(); 
    printf("Thread number: %i\nThread ID: %u\n", *thread_no, thread_id); 

    ... 
} 

不幸的是,對於原因,我不明白,這有每個線程都有線程數目(不包括ID)2.

任何意見,將不勝感激的效果!

編輯:繼答案的建議下,我做了相應的INTS的全局數組,並通過引用作爲&改編[I],從for循環

回答

2

問題就在這裏:

for(j = 0; j < threads_count; j++) { 
    int thread_number = j; 
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) &thread_number); 
} 

你發送到my_func,作爲void*參數,僅在給定的for循環範圍內定義的局部變量的地址。一旦你離開for環路,訪問地址thread_number導致未定義的行爲

你可以做同樣的

for(j = 0; j < threads_count; j++) { 
    int thread_number = j; 
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) thread_number); 
} 

(合格thread_number作爲void*值),然後取消對它的引用這樣的:

void *my_func(void *thread) { 
    int thread_no = (int)thread; 
    pthread_t thread_id = pthread_self(); 
    printf("Thread number: %i\nThread ID: %u\n", thread_no, thread_id); 

    ... 
} 

然而這是不是最好的方法自不建議在intvoid*之間搞亂(不只是intvoid*,但任何一種非指針類型的指針)。

更好的方法是爲每個線程使用一些全局結構,並將該結構的地址作爲void*參數傳遞給my_func