Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: ApNow en 08 de Agosto de 2006, 06:55:03 PM

Título: Threads o Procesos
Publicado por: ApNow en 08 de Agosto de 2006, 06:55:03 PM
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.
Título: Threads o Procesos
Publicado por: Elvis Enmanuel en 09 de Agosto de 2006, 08:07:06 AM
http://www.codeproject.com/threads/work_queue.asp

Se recomiendan encarecidamente los posix threads :)

ains
Título: Threads o Procesos
Publicado por: Daemon en 09 de Agosto de 2006, 11:36:45 AM
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.
Título: Threads o Procesos
Publicado por: ApNow en 10 de Agosto de 2006, 11:24:22 PM
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