pthread_join和pthread_create

时间:2013-03-14 23:02:25

标签: pthreads

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

#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

1 个答案:

答案 0 :(得分:1)

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

int num = i;

致电时

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

然后将num的地址传递给线程。现在在每个创建的线程中,您使用以下地址:

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

因此,*incoming将成为主函数中num的指针。问题是,它将成为每个其他线程正在使用的相同 num的指针。并且您不断更改num的值。因此,每个线程都将查看您为其设置的最后一个值。