la pregunta es:
para escribir el programa mundial entero en una dimensión de la matriz a de tamaño N por un factor de M. el uso de hilos , el hilo principal inicializa Una y M con enteros aleatorios, crea N subprocesos tales que la i-ésima hilo se encuentra Ai = M * Ai, y finalmente se imprime la matriz A.

mi problema estoy teniendo un error con la inicialización de matrices también no estoy seguro sobre la fabricación de los hilos en forma correcta.
espero haber explicado mi problema con claridad.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int M;
int [10] A;

void *run(void *t)
{
   A[(int)t]=A[(int)t]*M;
   pthread_exit(NULL);
}


int main()
{
   pthread_t [10] th;
   srand(time(0))%20;
   M=rand();
   int t;
   for(t = 0; t < 10; t++)
   {
     pthread_create(&th[t], NULL, run, (void *)t);
   }

   int j;
   for(j=0;j<10;j++)
    A[j]=j;

   int i;
   for(i = 0; i < 10; i++)
   {
     pthread_join(th[i], NULL);
     printf("%d:  %d\n", i,A[i]);
   }

   printf("Thread main\n");
   pthread_exit(NULL);
}

estos son los errores:

que1.c:5: error: expected identifier or ‘(’ before ‘[’ token
que1.c: In function run’:
que1.c:9: error: A undeclared (first use in this function)
que1.c:9: error: (Each undeclared identifier is reported only once
que1.c:9: error: for each function it appears in.)
que1.c: In function main’:
que1.c:16: error: expected identifier or ‘(’ before ‘[’ token
que1.c:17: error: void value not ignored as it ought to be
que1.c:22: error: th undeclared (first use in this function)
que1.c:27: error: A undeclared (first use in this function)
  • int a[10]; /* */
  • Puede usted corregir su código de arriba también?
InformationsquelleAutor tom hallen | 2011-03-16

3 Comentarios

  1. 4

    Parece que está teniendo una Java de fondo (o D), como usted escribió int [10] A. Usted puede leer esto como A es una variable a un array de 10 enteros tipo de objeto. Pero en la C que las cosas son un poco diferentes. En C no son sólo individuales variables primitivas, y pueden ser dispuestos en conjuntos de continuo la memoria, lo que se llama una matriz. Es por eso que la sintaxis int A[10]; fue elegido, lo que significa: A es un puntero a entero, señalando el comienzo de automáticamente de almacenamiento asignado para 10 números enteros.

    El siguiente problema con el programa, aunque el compilador no está pasando un entero a través de un void* tipo. En C cada puntero puede ser convertido a un número entero, pero no todos los valores enteros de hacer los punteros. Los punteros en C son cosas abstractas: la Mayoría de las implementaciones de elegir el uso de la dirección de memoria como su entero representación. Pero sería tan válido para asignarlos a través de un inyectiva LUT. Para algunos valores enteros no puede asignar a un puntero, y por lo tanto no transferir correctamente. Usted realmente debe aprobar un real puntero.

    También el uso de hilos es subóptima. En el caso de que usted está destrozando líneas de caché como un loco y la sobrecarga por cambio va a comer cualquier paralelización de ganancia. Como regla general, usted debe crear más de «número de núcleos de CPU’ + 2 hilos. Teniendo en cuenta todo esto se podría hacer lo siguiente:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    /* some prime number, so show what happens with uneven work sizes */
    #define ELEMENTS 17
    int M;
    int A[ELEMENTS];
    struct WorkletInfo {
    int *data_base;
    int count;
    };
    void *worklet(void *t)
    {
    int i;
    struct WorkletInfo *wi = t; /* note: no cast here */
    if(!wi)
    return 0;
    for(i=0; i < wi->count; i++)
    wi->data_base[i] *= M;
    return wi;
    }
    #define N_CPUS 4
    #define NUM_THREADS (N_CPUS+1)
    int main(int argc, char *argv[])
    {
    int t, ec;
    pthread_t th[NUM_THREADS];
    int remaining_elements;
    int const elements_per_worklet = ELEMENTS/NUM_THREADS;
    srand(time(0));
    M=rand();
    /* you must initialize the data a thread will access before starting the thread */
    for(t = 0; t < ELEMENTS; t++)
    A[t]=t+1; /* 0 * x = 0, so give it some nonzero value */
    remaining_elements = ELEMENTS - (elements_per_worklet*NUM_THREADS);
    ec = 0;
    for(t = 0; t < NUM_THREADS; t++)
    {
    struct WorkletInfo *wi = malloc(sizeof(*wi));
    wi->data_base = &A[ec];
    wi->count = elements_per_worklet;
    if(t<remaining_elements) {
    wi->count++;
    }
    ec += wi->count;
    pthread_create(&th[t], NULL, worklet, wi);
    }
    ec = 0;
    for(t = 0; t < NUM_THREADS; t++)
    {
    int i;
    struct WorkletInfo *wi;
    void *retval;
    pthread_join(th[t], &retval);
    if(!retval)
    continue;
    wi = retval;
    for(i = 0; i < wi->count; i++, ec++)
    printf("worklet %d, worklet element %d => total element %d:  %d\n", 
    t, i, ec, 
    wi->data_base[i]);
    free(wi);
    }
    printf("Thread main\n");
    return 0;
    }

    La salida de este programa se parece a esto:

    worklet 0, worklet element 0 => total element 0:  300787748
    worklet 0, worklet element 1 => total element 1:  601575496
    worklet 0, worklet element 2 => total element 2:  902363244
    worklet 1, worklet element 0 => total element 3:  1203150992
    worklet 1, worklet element 1 => total element 4:  1503938740
    worklet 1, worklet element 2 => total element 5:  1804726488
    worklet 1, worklet element 3 => total element 6:  2105514236
    worklet 2, worklet element 0 => total element 7:  -1888665312
    worklet 2, worklet element 1 => total element 8:  -1587877564
    worklet 2, worklet element 2 => total element 9:  -1287089816
    worklet 3, worklet element 0 => total element 10:  -986302068
    worklet 3, worklet element 1 => total element 11:  -685514320
    worklet 3, worklet element 2 => total element 12:  -384726572
    worklet 3, worklet element 3 => total element 13:  -83938824
    worklet 4, worklet element 0 => total element 14:  216848924
    worklet 4, worklet element 1 => total element 15:  517636672
    worklet 4, worklet element 2 => total element 16:  818424420
    Thread main exit
  2. 2

    Su primer problema es puramente una sintaxis uno. Esto no es válido C:

    int [10] A;

    Debe ser:

    int A[10];

    Mismo para pthread_t [10] th;.

    • tienes razón, esto es totalmente correcto . he corregido mi código, pero todavía hay un solo error en la línea 17.
    • el error dice: que1.c:17: error: void valor se ignora como debe ser
    • Los mensajes de error están diciendo donde los mensajes de error! Si el primer mensaje de error se refiere a la línea 17, entonces eche un vistazo en la línea 17 y trabajar de lo que está mal con él. No te lo tomes a mal, pero si usted no sabe cómo interpretar los mensajes de error y el trabajo lo que está mal con su sintaxis, entonces usted probablemente no debería estar tratando de escribir un multiproceso programa en C, pero aún así…
  3. 2

    Además a @Oli Charlesworth la respuesta, srand no devuelve ningún valor, es declarado como void, por lo que no se puede escribir srand(time(0)) % 20.

Dejar respuesta

Please enter your comment!
Please enter your name here