0

我是多线程编程的菜鸟。这里我写了一个小程序来计算 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

4

1 回答 1

1

您的所有线程只有一个整数。具体来说:

int num = i;

你打电话时

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

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

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

所以,*incoming将是一个指向num主函数的指针。问题是,它将是一个指向所有其他线程正在使用的相同的指针。 num而你不断改变num. 因此,每个线程都只会查看您为其设置的最后一个值。

于 2013-03-14T23:07:48.760 回答