1

指定された数の乱数を生成するプログラムを C で開発しようとしています。これを高速化するには、特定の数のスレッドを使用することになっています。通常のランダム関数はスレッドでは機能しないことがわかり、代わりに random_r を使用しています。initstate_r 関数で SegFault が発生し続けますが、変数にアクセスするのではなく、変数を初期化しようとしているため意味がありません。ここで私が間違っていることを誰かに教えてもらえますか? (initstate_r 関数は、generateRandomNumbers 関数にとどまる必要があります。)

コードは次のとおりです。

#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>  // must include stdio  for pvm3.h to compile correctly
#include <sys/times.h> /* for times system call */
#include <sys/time.h>  /* for gettimeofday system call */
#include <pthread.h>

/*#define DEBUG 1*/

#define RANDOM_SEED   12345678 

//The main work routine
//void generateRandomNumbers(long long);  
void *generateRandomNumbers(void *);
double getMilliSeconds();

/* The main work routine */
//void generateRandomNumbers(long long int count)  
void *generateRandomNumbers(void *arg)
{
    struct random_data buf;
    int32_t result;
    char rand_statebuf;
    printf("hold 1\n");
    // This is the function that gives me a SegFault
    initstate_r(RANDOM_SEED, &rand_statebuf, 128, &buf);
    printf("hold 2\n"); 

    long long int* count = (long long int*) arg;
    //printf("Count for thread ID# %ld is %lld\n", pthread_self(), *count);
    long long int i;
    //long int x;

    srandom_r(RANDOM_SEED, &buf);
    for (i = 0; i < *count; i++) {
        random_r(&buf, &result);
#ifdef DEBUG
        printf("%ld\n", result);
#endif
    }
    pthread_exit(NULL);
}


int main(int argc, char **argv)
{
    long long int count, newCount;
    int numThreads;
    //pthread_t *tids;

    double timeStart = 0;
    double timeElapsed = 0;

    if (argc < 3) {
        fprintf(stderr, "Usage: %s <n>\n" ,argv[0]);
        exit(1);
    }
    sscanf(argv[1],"%lld",&count); /* lld for long long int */
    sscanf(argv[2],"%d",&numThreads);
    pthread_t tids[numThreads];
    newCount = count/numThreads;

    timeStart = getMilliSeconds();  //And we are off

    int i;
    for (i=0; i<numThreads; i++)
    {
        pthread_create(&tids[i], NULL, generateRandomNumbers, (void *) &newCount);
    //pthread_join(tids[i], NULL);
    }

    int j;
    for (j=0; j<numThreads; j++)
    {
        pthread_join(tids[j], NULL);
    }

    //generateRandomNumbers(count);
    printf("generated %lld random numbers\n", count);

    timeElapsed = getMilliSeconds() - timeStart;
    printf("Elapsed time:  %lf seconds\n",(double)(timeElapsed/1000.0));
    fflush(stdout);

    exit(0);
}
4

1 に答える 1

2

問題は、initstate_r の 2 番目のパラメーターが char* であると想定されていることです。

あなたがやる:

char rand_statebuf;
printf("hold 1\n");
// This is the function that gives me a SegFault
initstate_r(RANDOM_SEED, &rand_statebuf, 128, &buf);

文字ポインターの要件を満たす1文字へのポインターを渡しますが、1文字よりもはるかに多くのスペースが必要です。そのはず:

char rand_statebuf[128];
initstate_r(RANDOM_SEED,rand_statebuf,sizeof(rand_statebuf),&buf);
于 2013-08-05T19:36:35.207 に答える