2013-03-14 65 views
0

我是一个多线程编程的新手。在这里我写了一个小程序来计算从0到20的平方根。我的thread_id数组的大小是3.我的策略就像要求thread_ID [0]计算0,3,6 ...和thread_ID的平方根[ 1]来计算1,4,7 ... 但结果似乎有一些问题。有重复的结果。pthread_join和pthread_create

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

#define THREAD_NUM 3 

void *thread_function(void *arg) 
{ 
    int *incoming = (int*)(arg); 

    double result = sqrt(*incoming); 
    printf("The square root of %d is %f\n ",*incoming, result); 
    return NULL; 
} 

int main(void) 
{ 
    pthread_t thread_ID[THREAD_NUM]; 

    void *exit_result; 
    int i; 

    for(i = 0; i < 20; i++) 
    { 
     int id = i%THREAD_NUM; 
     int num = i; 
     if(i >= THREAD_NUM) 
     { 
      if(pthread_join(thread_ID[id], &exit_result) != 0) 
       perror("join failed"); 
     } 

     if(pthread_create(&thread_ID[id],NULL,thread_function,&(num)) != 0) 
      perror("create failed"); 

    } 
    for(i = 0; i < THREAD_NUM; i++) 
    { 
     pthread_join(thread_ID[i], &exit_result); 
    } 
    return 0; 
} 

结果是

的2的平方根是1.414214 3的平方根是1.732051 的2的平方根是1.414214 4的平方根是2.000000 的平方根图5是2.236068 7的平方根是2.645751 8的平方根是2.828427 6的平方根是2.449490 9的平方根是3.000000 10的平方根是3.162278 12的平方根是3.464102 13的平方根是3.605551 11的平方根是3.316625 14的平方根是3.741657 15的平方根是3.872983 16的平方根是4.000000 平方18根为4.242641 17的平方根为4.123106 19的平方根为4.358899 19的平方根为4.358899

+0

请格式化代码,并将问题添加到您期望的输出中。 – Ankit 2013-03-14 23:24:41

回答

1

你只得到了所有的线程中的一个整数。具体做法是:

int num = i; 

当你调用

pthread_create(&thread_ID[id],NULL,thread_function,&(num)) 

随后的num地址传递给线程。

int *incoming = (int*)(arg); 

所以,*incoming将是从主功能num指针:现在在每个创建的线程,你如下使用这个地址。事情是,它将成为每个其他线程正在使用的相同的num的指针。而且你一直在改变num的价值。因此,每个线程都只是查看您为其设置的最后一个值。

+0

是的。另外,创建和重复加入线程来执行单一值的这种小事并不是一个好主意。听起来好像是提前分割工作负载的好地方(为每个线程传递一系列独立的值)或使用线程池。后者对于这个小问题肯定是过分的。 – 2013-03-14 23:12:49

+0

我知道这不是一个好设计,只是想知道是什么原因造成的。好的,现在我完全明白了,谢谢你们! – 2013-03-15 01:07:43

+0

如果这个答案是正确的,你能将它标记为已回答吗? – wilsonmichaelpatrick 2013-03-15 02:29:06