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

すべてのスレッドに対して 1 つの整数しかありません。具体的には:

int num = i;

電話すると

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

次に、のアドレスがnumスレッドに渡されます。作成された各スレッドで、このアドレスを次のように使用します。

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

したがって、メイン関数からの*incomingポインタになります。問題は、他のすべてのスレッドが使用しているものnumへのポインタになるということです。そして、 の値を変更し続けます。そのため、すべてのスレッドは、最後に設定した値を参照するだけです。 numnum

于 2013-03-14T23:07:48.760 に答える