2011-05-11 83 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);