<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Al trabajar con hilos, en mi caso particular Pthreads. Hay una función que te devuelve la direccion de comienzo de la pila 'pthread_attr_getstackaddr()'. El resto es como explico en el mail. Al intentar escribir a partir de esa dirección me sale el segmentation fault.<div><br></div><div>Prueba el código si quieres y te darás cuenta.<br><div><div>El 22/06/2010, a las 17:04, David Fire escribió:</div><br class="Apple-interchange-newline"><blockquote type="cite">por que queres darle la direccion donde inicia???<br>para entender tu problema...<br><br><div class="gmail_quote">El 22 de junio de 2010 06:56, Jorge Vega Sanchez <span dir="ltr"><<a href="mailto:memmaker650@gmail.com">memmaker650@gmail.com</a>></span> escribió:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Buenas.<br>
<br>
Otra preguntita que esta semana estoy pedigüeño.<br>
<br>
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.<br>
<br>
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).<br>
<br>
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.<br>
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.<br>
<br>
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.<br>
<br>
Pongo el código por si alguno le interesa:<br>
<br>
<br>
<br>
#include <pthread.h><br>
#include <stdio.h><br>
#include <stdlib.h><br>
#include <iostream><br>
<br>
#define NTHREADS 1<br>
<br>
using namespace std;<br>
<br>
pthread_attr_t attr;<br>
<br>
class STACK<br>
{<br>
  public:<br>
     size_t apilados;        // Numero de objetos en LA PILA<br>
     size_t tamanyo_pila;<br>
     int tamanyo;<br>
     int *addr_top, *addr_bottom;<br>
<br>
     void init(void *dir, int tam);<br>
     void clean();        // Vacia LA PILA<br>
     void push(int v);     // Agrega Valores en el tope de la PILA<br>
     int pop();           // Retorna y elimina el tope de la PILA<br>
};<br>
// La pila por defecto en un Thread tiene un tamaño de 1MB=1024x1024=1048576 --> 32bit/word=32768 datos<br>
// Supongo que nunca vamos a llenar ni de lejos la pila.<br>
<br>
void STACK::init(void *dir, int tam)        // Inicializacion de la PILA<br>
{<br>
  apilados=0;   // Asinamos valores<br>
  addr_top=addr_bottom=(int*)dir;<br>
  tamanyo_pila=tam;<br>
}<br>
<br>
void STACK::clean()        // Vacia la PILA<br>
{<br>
  apilados=0;<br>
  for(int i=0; i<=apilados; i++)<br>
  {<br>
        free(addr_top);                 // Libero el espacio utilizado por la pila<br>
        addr_top+=1;<br>
  }<br>
}<br>
<br>
//Se Agrega(PUSH) un valor en el tope de la pila<br>
void STACK::push(int v)<br>
{<br>
        // Apilamos el elemento y apuntamos a la siguiente posicion de memoria<br>
        tamanyo=sizeof(v);<br>
        cout << "introducimos dato" << endl;<br>
        *addr_bottom=v;<br>
        addr_bottom+=1;<br>
        apilados++;<br>
}<br>
<br>
// Se Elimina (POP) el ultimo valor de la pila<br>
// y retorna el nuevo tope<br>
int STACK::pop()<br>
{<br>
  if(apilados>0)<br>
  {<br>
        apilados--;<br>
        addr_top+=1; // Delpazo el tope de la pila<br>
        cout << "El valor del tope eliminado era: ";<br>
        return(*(addr_top-1));<br>
  }<br>
  else<br>
  {<br>
                cout << "No existen datos para eliminar.  ERROR ";<br>
                return 0;<br>
  }<br>
}<br>
<br>
void *funcion(void *threadid)<br>
{<br>
   void  *stackaddr;<br>
   size_t stacksize;<br>
   STACK pila;<br>
<br>
    cout << "Hilo 1 DEntro " << endl;<br>
   // Tomar la dirección de comienzo de la pila<br>
   int flag = pthread_attr_getstackaddr(&attr, &stackaddr);<br>
   cout << "Flag: " << flag << endl;<br>
   /* if (flag != 0)<br>
   {<br>
      printf("pthread_attr_getstackaddr returned: %d\n", flag);<br>
      //return -1;<br>
   }<br>
   else<br>
   {<br>
      printf("Retrieved stackaddr is %d \n", stackaddr);<br>
   } */<br>
<br>
   // Tamaño de la pila del Thread<br>
   pthread_attr_getstacksize (&attr, &stacksize);<br>
   cout << "Tamaño pila Hilo 1: " << stacksize << endl;<br>
<br>
   //Manejo de la Pila<br>
   cout << "inicializamos la pila: " << endl;<br>
   pila.init(stackaddr, stacksize);<br>
<br>
   cout << "Metemos datos a la pila: " << endl;<br>
   pila.push(43);<br>
   cout << "Dato 1 para pila: " << stacksize << endl;<br>
   pila.push(325);<br>
   cout << "Dato 2 para pila:: " << stacksize << endl;<br>
   pila.push(4);<br>
<br>
   cout << "Dato 3 para pila: " << endl;<br>
   pila.pop();<br>
<br>
   cout << "Liberamos espacio de la pila: " << endl;<br>
   pila.clean();<br>
<br>
   pthread_exit(NULL);<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
   pthread_t threads[NTHREADS];<br>
   size_t stacksize;<br>
   int rc;<br>
   long t;<br>
<br>
   pthread_attr_init(&attr);<br>
<br>
   int err=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);<br>
   if (err)<br>
      {<br>
         printf("ERROR; return code from pthread_create() is %d\n", rc);<br>
         return -1;<br>
      }<br>
<br>
   pthread_attr_getstacksize (&attr, &stacksize);<br>
   printf("Default stack size = %li\n", stacksize);<br>
<br>
   // pthread_attr_setstacksize (&attr, stacksize);     // En este caso me quedo con el tamaño por defecto<br>
   printf("Creating threads with stack size = %li bytes\n",stacksize);<br>
   for(t=0; t<NTHREADS; t++)<br>
   {<br>
      rc = pthread_create(&threads[t], &attr, funcion, (void *)t);<br>
      if (rc)<br>
      {<br>
         printf("ERROR; return code from pthread_create() is %d\n", rc);<br>
         return -1;<br>
      }<br>
   }<br>
<br>
   printf("Created %ld threads.\n", t);<br>
<br>
   for(t=0; t<NTHREADS; t++)<br>
   {<br>
        pthread_join(threads[t], NULL);<br>
   }<br>
<br>
}<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br><br clear="all"><br>-- <br> (\__/) <br>(='.'=)This is Bunny. Copy and paste bunny into your <br>(")_(")signature to help him gain world domination. <br><br>
_______________________________________________<br>Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br><a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ</blockquote></div><br></div></body></html>