Die Fibonacci-Folge, die Verwendung von threads in C

Schrieb ich ein Programm in C zu generieren, die eine Fibonacci-Sequenz mit n zahlen, wobei jede Fibonacci-Zahl, die sich durch einen separaten thread, dem Eltern thread Ausgänge ganze produziert Fibonacci-Folge doch ich bekam falsche Reihenfolge für n>2 ist es, wie einige schreiben Sie den Wert des letzten Elements in der Fibonacci-Sequenz-array ist 0, wenn n>2 .Wie kann ich es beheben? bitte finden Sie den code unten.

/*============================================================================
   Description :The Fibonacci sequence
  ============================================================================ */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int n;                          //size of fibonacci sequence.
int *fibseq;                    //arry holds the value of each fibonacci term.
int i;                          //counter for the threads.

void *runn(void *arg);

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("format is:./a.out <intgervalue>\n");
        return -1;
    }                           //valdiate num of args.

    if (atoi(argv[1]) < 0)
    {
        printf("%d must be>=0\n", atoi(argv[1]));
        return -1;
    }                           //valdiate value of arg1.

    n = atoi(argv[1]);
    fibseq = (int *)malloc(n * sizeof(int));
    pthread_t *threads = (pthread_t *) malloc(n * sizeof(pthread_t));
    pthread_attr_t attr;        //set of thread attribute

    pthread_attr_init(&attr);

    for (i = 0; i < n; i++)
    {
        pthread_create(&threads[i], &attr, runn, NULL);
    }                           //End of creating threads.

    int j;

    for (j = 0; j < n; j++)
    {
        pthread_join(threads[j], NULL);
    }                           //End of wating the threads to exit.

    //printing fibseq.
    printf("The Fibonacci sequence.:");
    int k;

    for (k = 0; k < n; k++)
    {
        printf("%d,", fibseq[k]);
    }                           //End of printing fibseq.
    return 0;
}                               //End of main.

void *runn(void *arg)
{
    if (i == 0)
    {
        fibseq[i] = 0;
        pthread_exit(0);
    }                           //first fib term

    if (i == 1)
    {
        fibseq[i] = 1;
        pthread_exit(0);
    }                           //seconed fib term
    else
    {
        fibseq[0] = 0;
        fibseq[1] = 1;

        int p, pp, fibp, fibpp;

        p = (i - 1);
        pp = (i - 2);
        fibp = fibseq[p];
        //printf("fibseq[%d]%d\n",p,fibp);
        fibpp = fibseq[pp];
        //printf("fibseq[%d]%d\n",pp,fibpp);
        fibseq[i] = fibseq[i - 1] + fibseq[i - 2];
        //printf("fibseq[%d]%d,\n",i,fibseq[i]);
        pthread_exit(0);        //thread exit.
    }                           //End of else
}                               //End of run.
  • Da jeder Wert ist abhängig von der vorherigen, warum willst du es mit threads? Es wird nur zu Problemen führen, da Sie mitbekommen habe. Nichts sagt, dass der Wert n bestimmt werden, bevor n+1, so Werte sind Müll.
  • Warum wollen Sie dies tun? Es scheint ziemlich ungeeignet zur Parallelisierung. Sie hätten die Reihenfolge der threads eine nach der anderen sowieso.
  • Ziel ist es, zu üben, wie Fäden produzieren können, die Reihenfolge, und ich pthread_join zum synchronisieren der threads, die aber immer noch nicht die richtige Ausgabe
InformationsquelleAutor learn | 2015-12-14
Schreibe einen Kommentar