Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Threads o Procesos

Iniciado por ApNow, 08 de Agosto de 2006, 06:55:03 PM

« anterior - próximo »

ApNow

Hola,

  Llevo leyendo durante mucho tiempo estos foros, y hasta la fecha no me he <<dignado>> a escribir.

 En este mismo momento tengo un problemilla con estos asuntos, por lo que me he lanzado y a ver que pasa.

Os cuento:

  El programa sencillamente debe realizar los siguientes pasos:
      - Conectarse a una base de datos Postgres y obtener una lista con las direcciones IP y ficheros (.tar) a enviar via FTP.

     - Crear un thread con esta información, buzonear el fichero en la ip indicada.

     - Lanzar dos comandos via rsh (uno para descomprimir el .tar y otro para ejecutar el .sh adjunto en el fichero).

    - Recibir el resultado de la operación y actualizar las tablas.

La cuestión es que un vez finalizado el proceso de buzoneo del fichero, y, si deseo llamar al primer comando de descompresión, el resto de los threads mueren, quedando ese thread con el nuevo proceso (en este caso el tar).

Creo que es una cuestión de linux, dado que es imposible crear una llamada tipo exec() dentro de un hilo.

La pregunta es:
  Existe alguna forma de realizar esta operación (en multithread) o es necesario crear un proceso en vez de un thread?

Lenguaje de programación: c++ bajo RH9 y Ubuntu 6.06

Un saludo.

Elvis Enmanuel


Daemon

Podrias probar a hacer un fork antes del exec. Copio aqui una parte de las paginas man relativa a esto:

 POSIX Threads
    In applications that use the POSIX threads API  rather  than
    the   Solaris   threads   API  (  applications  linked  with
    -lpthread, whether or not linked with -lthread), a  call  to
    fork() is like a call to  fork1(), which replicates only the
    calling thread. There is no call that forks a child with all
    threads and LWPs duplicated in the child.

    Note that if a program is  linked  with  both  libraries  (-
    lthread  and  -lpthread),  the POSIX semantic of fork() pre-
    vails.

 fork() Safety
    If a Solaris threads application calls fork1()  or  a  POSIX
    threads  application  calls  fork(), and the child does more
    than simply call exec(), there is a possibility of  deadlock
    occurring   in   the   child.  The  application  should  use
    pthread_atfork(3C) to ensure safety  with  respect  to  this
    deadlock. Should there be any outstanding mutexes throughout
    the process, the application should call pthread_atfork() to
    wait  for  and acquire those mutexes prior to calling fork()
    or fork1(). See   "MT-Level  of  Libraries"  on  the  attributes(5)
     manual page.
Imagina todo lo que puedes hacer. Despues hazlo.

ApNow

Hola,

 Al final no es posible utilizar threads. Parece ser que un hilo no puede contener un proceso en si( una llamada al sistema como por ejemplo rsh), ya que se cargaría todo el espacio de memoria compartido con el resto de threads.

Por lo tanto, solo queda la solución multiproceso. Alguien tiene algun tutorial o ejemplo para codificar un pool de procesos (10 max por ejemplo) y poder manejar todos las posibles ocurrencias con solo esos? En plan esperar a que finalice (no importa el estado) una vez finalizado (libre) y en caso de que haya mas datos a tratar reasignarlos etc.


Un saludo






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.