[C con Clase] Reserva de memoria a partir de una dirección dada.

David Fire ddfire en gmail.com
Mar Jun 22 17:04:40 CEST 2010


por que queres darle la direccion donde inicia???
para entender tu problema...

El 22 de junio de 2010 06:56, Jorge Vega Sanchez
<memmaker650 en gmail.com>escribió:

> Buenas.
>
> Otra preguntita que esta semana estoy pedigüeño.
>
> Estoy tratando de utilizar una pila dentro de los hilos (POSIX en mi caso).
> Dado que se dice que al crear un hilo se crea un espacio para la pila del
> hilo. Bueno esto es lo de menos.
>
> La cosa es que consigo la dirección de este  espacio de memoria reservado
> para la pila y el tamaño de este espacio (size_t).
>
> Al tratar de escribir 3 o 4 datos y posteriormente tratar de sacar uno de
> ellos como mera prueba sucede que al tratar de meter el primer dato me sale
> un SEGMENTATION FAULT asín de grande.
> Supongo que me sale porque estoy intentado entrar en una zona de memoria no
> reservada para mi (aunque se supone que si). Bueno entonces me gustaría
> saber si hay alguna forma de reservar ese espacio.
>
> Con malloc reservas una cantidad de memoria y te devuelve el puntero que
> apunta a esa zona. Yo lo que busco es un malloc pero dandole yo además la
> dirección de inicio de la pila.
>
> Pongo el código por si alguno le interesa:
>
>
>
> #include <pthread.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <iostream>
>
> #define NTHREADS 1
>
> using namespace std;
>
> pthread_attr_t attr;
>
> class STACK
> {
>  public:
>     size_t apilados;        // Numero de objetos en LA PILA
>     size_t tamanyo_pila;
>     int tamanyo;
>     int *addr_top, *addr_bottom;
>
>     void init(void *dir, int tam);
>     void clean();        // Vacia LA PILA
>     void push(int v);     // Agrega Valores en el tope de la PILA
>     int pop();           // Retorna y elimina el tope de la PILA
> };
> // La pila por defecto en un Thread tiene un tamaño de
> 1MB=1024x1024=1048576 --> 32bit/word=32768 datos
> // Supongo que nunca vamos a llenar ni de lejos la pila.
>
> void STACK::init(void *dir, int tam)        // Inicializacion de la PILA
> {
>  apilados=0;   // Asinamos valores
>  addr_top=addr_bottom=(int*)dir;
>  tamanyo_pila=tam;
> }
>
> void STACK::clean()        // Vacia la PILA
> {
>  apilados=0;
>  for(int i=0; i<=apilados; i++)
>  {
>        free(addr_top);                 // Libero el espacio utilizado por
> la pila
>        addr_top+=1;
>  }
> }
>
> //Se Agrega(PUSH) un valor en el tope de la pila
> void STACK::push(int v)
> {
>        // Apilamos el elemento y apuntamos a la siguiente posicion de
> memoria
>        tamanyo=sizeof(v);
>        cout << "introducimos dato" << endl;
>        *addr_bottom=v;
>        addr_bottom+=1;
>        apilados++;
> }
>
> // Se Elimina (POP) el ultimo valor de la pila
> // y retorna el nuevo tope
> int STACK::pop()
> {
>  if(apilados>0)
>  {
>        apilados--;
>        addr_top+=1; // Delpazo el tope de la pila
>        cout << "El valor del tope eliminado era: ";
>        return(*(addr_top-1));
>  }
>  else
>  {
>                cout << "No existen datos para eliminar.  ERROR ";
>                return 0;
>  }
> }
>
> void *funcion(void *threadid)
> {
>   void  *stackaddr;
>   size_t stacksize;
>   STACK pila;
>
>    cout << "Hilo 1 DEntro " << endl;
>   // Tomar la dirección de comienzo de la pila
>   int flag = pthread_attr_getstackaddr(&attr, &stackaddr);
>   cout << "Flag: " << flag << endl;
>   /* if (flag != 0)
>   {
>      printf("pthread_attr_getstackaddr returned: %d\n", flag);
>      //return -1;
>   }
>   else
>   {
>      printf("Retrieved stackaddr is %d \n", stackaddr);
>   } */
>
>   // Tamaño de la pila del Thread
>   pthread_attr_getstacksize (&attr, &stacksize);
>   cout << "Tamaño pila Hilo 1: " << stacksize << endl;
>
>   //Manejo de la Pila
>   cout << "inicializamos la pila: " << endl;
>   pila.init(stackaddr, stacksize);
>
>   cout << "Metemos datos a la pila: " << endl;
>   pila.push(43);
>   cout << "Dato 1 para pila: " << stacksize << endl;
>   pila.push(325);
>   cout << "Dato 2 para pila:: " << stacksize << endl;
>   pila.push(4);
>
>   cout << "Dato 3 para pila: " << endl;
>   pila.pop();
>
>   cout << "Liberamos espacio de la pila: " << endl;
>   pila.clean();
>
>   pthread_exit(NULL);
> }
>
> int main(int argc, char *argv[])
> {
>   pthread_t threads[NTHREADS];
>   size_t stacksize;
>   int rc;
>   long t;
>
>   pthread_attr_init(&attr);
>
>   int err=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
>   if (err)
>      {
>         printf("ERROR; return code from pthread_create() is %d\n", rc);
>         return -1;
>      }
>
>   pthread_attr_getstacksize (&attr, &stacksize);
>   printf("Default stack size = %li\n", stacksize);
>
>   // pthread_attr_setstacksize (&attr, stacksize);     // En este caso me
> quedo con el tamaño por defecto
>   printf("Creating threads with stack size = %li bytes\n",stacksize);
>   for(t=0; t<NTHREADS; t++)
>   {
>      rc = pthread_create(&threads[t], &attr, funcion, (void *)t);
>      if (rc)
>      {
>         printf("ERROR; return code from pthread_create() is %d\n", rc);
>         return -1;
>      }
>   }
>
>   printf("Created %ld threads.\n", t);
>
>   for(t=0; t<NTHREADS; t++)
>   {
>        pthread_join(threads[t], NULL);
>   }
>
> }
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
(\__/)
(='.'=)This is Bunny. Copy and paste bunny into your
(")_(")signature to help him gain world domination.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100622/b9038c08/attachment.html>


Más información sobre la lista de distribución Cconclase