2015-10-17 89 views
0

以下是我想實現線程數組的一個c程序。 有兩個線程函數。我想在每個函數內發送一個int值。但是代碼沒有給出任何輸出。 示例程序:實現線程數組

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


void * threadFunc1(void * arg) 
{ 

    int id = *((int *) arg); 
    printf("Inside threadfunc2 for thread %d",id) 
} 

void * threadFunc2(void * arg) 
{ 
    int i= *((int *)arg); 
    printf("Inside threadfunc2 for thread %d",i) 

} 

int main(void) 
{ 

    pthread_t thread[10]; 

    for(int i=0;i<10;i++) 
    { 

     pthread_create(&thread[i],NULL,threadFunc1,(void*)&i); // want to send the value of i inside each thread 

     pthread_create(&thread[i],NULL,threadFunc,(void*)&i); 
    } 


    while(1); 
    return 0; 
} 

代碼中有什麼問題嗎?

+0

如果您使用C++,請使用'std :: thread',這是一回事。然後,你問題中的C標籤也是錯誤的。在任何情況下,它都缺少有關代碼在執行時的作用以及您的期望。我的水晶球告訴我,你應該嘗試使用'%p'格式說明符輸出傳遞給線程函數的指針,或者只是將其傳遞給'std :: cout'。 –

+0

請參閱[@UlrichEckhardt](http://stackoverflow.com/questions/33183877/implementing-an-array-of-thread#comment54174239_33183877)的評論。這就是爲什麼每個人都會告訴你**不要用C++標記**來標記c問題。 –

+0

你能分享獲得的輸出嗎? –

回答

1

只需在線程函數內的printf中的字符串中添加一個「\ n」終止符。這將強制flushing the output buffer

您粘貼的代碼中也存在一些語法錯誤,但您可能很容易將其計算在內。您可以使用pthread_join()而不是while (1); ...

0

線程[i]應該是pthread_create返回的新線程的唯一標識符(它將保存新創建的線程的線程ID)。 ,在這裏提供的代碼中,線程[i]被第二個pthread_create()覆蓋。一種方法可以是具有的pthread_t爲threadFunc1和ThreadFunc中的單獨的陣列如下:

pthread_t thread_func[10]; 
pthread_t thread_func1[10]; 

對於傳遞的數據類型爲int的自變量到線程,則需要在堆上分配一個int並把它傳遞給pthread_create()如下:

for(i=0;i<10;i++) 
{ 
    int *arg = malloc(sizeof(*arg)); 
    *arg = i; 
    pthread_create(&thread_func[i],NULL,threadFunc,(void*)arg); 
    int *arg1 = malloc(sizeof(*arg1)); 
    *arg1 = i; 
    pthread_create(&thread_func1[i],NULL,threadFunc1,(void*)arg1); 
} 

確保以釋放從堆存儲器中,如下所示的各線程函數:

void *threadFunc(void *i) { 
    int a = *((int *) i); 
    printf("threadFunc : %d \n",a); 
    free(i); 
} 
void *threadFunc1(void *i) { 
    int a = *((int *) i); 
    printf("threadFunc1 : %d \n",a); 
    free(i); 
} 

此外,使用在pthread_join如下項tead of while end:

for (i=0;i<10;i++) 
{ 
    pthread_join(thread_func[i],NULL); 
    pthread_join(thread_func1[i],NULL); 
}