2011-05-11 118 views
1

我想用c語言編寫一個多線程程序。我使用posix線程庫。c多線程程序

我寫了下面的代碼:

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

void *put (int *arg) 
{ 
    int i; 
    //int * p; 
    // p=(int*)arg; 
    for(i=0;i<5;i++) 
    { 
     printf("\n%d",arg[i]); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    int a[5]={10,20,30,40,50}; 
    pthread_t s; 
    pthread_create(&s,NULL,put,a); 
    printf("what is this\n"); 
    return 0; 
} 

我只是希望我的線程就顯示出數組中的項目。有下列警告編譯的程序:

tm.c:19: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type 
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int *)’ 

當我運行該程序,我得到了出來放在主線程,但沒有存儲在數組中的值。

現在誰能告訴我我做錯了什麼? 如何發送數組作爲線程函數中的參數?

如果我只是改變了代碼點點編譯時警告,解決了更改後的代碼如下:

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


void *put (void *arg) 
{ 
    int i; 
    int * p; 
    p=(int*)arg; 
    for(i=0;i<5;i++) 
    { 
     printf("\n%d",p[i]); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    int a[5]={10,20,30,40,50}; 
    pthread_t s; 
    pthread_create(&s,NULL,put,a); 
    printf("what is this\n"); 
    return 0; 
} 

但產量不會改變。任何人都可以告訴我我做錯了什麼?將數組發送到線程函數的正確方法是什麼(在這種情況下)?

回答

5

您的代碼創建線程,然後該過程通過達到main的末尾而退出。你必須等待線程有機會執行,通過調用pthread_join或休眠一下。

0

首先,您需要等待線程完成才能從main()返回。

此代碼的另一個問題是數組a分配在main()例程的堆棧上,因此在不同線程的上下文中可能無效。您應該撥打a並撥打電話malloc()

如果您等待線程在main()中完成,那麼a可能是有效的,因爲main()的堆棧幀仍然存在。但是,未來的任何重構都可能導致您的悲傷,因此請切換至使用malloc()

0

嘗試之前,你的return 0;

等待你的線程來執行,添加

pthread_join(s, NULL);