Controles de Hilos

La pestania Hilos proporciona 8 controles para programacion concurrente: hilos, primitivas de sincronizacion, grupos de hilos y canales de comunicacion entre hilos. Todos los controles son multiplataforma y utilizan las instalaciones de hilos nativas del sistema operativo.

TThread CT_THREAD = 63

Ejecuta codigo en un hilo separado del sistema operativo. El bloque fundamental para operaciones concurrentes.

PropiedadTipoValor predet.Descripcion
nPriorityNumerico0Prioridad del hilo (-2 mas baja a +2 mas alta)
lFreeOnTerminateLogico.F.Destruir automaticamente el objeto cuando el hilo termina
lRunningLogico.F.El hilo se esta ejecutando actualmente (solo lectura)
lFinishedLogico.F.El hilo ha completado (solo lectura)
nThreadIdNumerico0Identificador de hilo del sistema operativo (solo lectura)
EventoCategoriaDescripcion
OnExecuteCiclo de vidaCodigo a ejecutar en el hilo (requerido)
OnTerminateCiclo de vidaHilo termino su ejecucion (llamado en el hilo principal)
MetodoDescripcion
Start()Iniciar la ejecucion del hilo
Wait( nTimeout )Esperar a que el hilo termine. Tiempo de espera opcional en ms
Cancel()Solicitar cancelacion cooperativa
PlataformaImplementacion Nativa
WindowsCreateThread / _beginthreadex
macOSpthread_create
Linuxpthread_create

TMutex CT_MUTEX = 64

Bloqueo de exclusion mutua. Asegura que solo un hilo acceda a un recurso compartido a la vez.

MetodoDescripcion
Lock()Adquirir el mutex. Se bloquea si otro hilo ya lo tiene
Unlock()Liberar el mutex
TryLock()Intentar adquirir sin bloqueo. Devuelve .T. si se adquirio
PlataformaImplementacion Nativa
WindowsCRITICAL_SECTION
macOSpthread_mutex_t
Linuxpthread_mutex_t

TSemaphore CT_SEMAPHORE = 65

Semaforo de conteo. Controla el acceso a un grupo de recursos compartidos con un conteo limitado.

PropiedadTipoValor predet.Descripcion
nInitialCountNumerico0Conteo inicial del semaforo
nMaxCountNumerico1Conteo maximo del semaforo
MetodoDescripcion
Wait( nTimeout )Decrementar conteo. Se bloquea si el conteo es cero. Tiempo de espera opcional en ms
Signal()Incrementar conteo. Despierta un hilo en espera

TCriticalSection CT_CRITICALSECTION = 66

Primitiva de sincronizacion ligera. Mas rapida que TMutex para proteger secciones de codigo cortas dentro del mismo proceso.

MetodoDescripcion
Enter()Entrar en la seccion critica. Se bloquea si otro hilo esta dentro
Leave()Salir de la seccion critica
TryEnter()Intentar entrar sin bloqueo. Devuelve .T. si entro

TThreadPool CT_THREADPOOL = 67

Gestiona un grupo de hilos de trabajo reutilizables. Envie tareas al grupo en lugar de crear hilos individuales.

PropiedadTipoValor predet.Descripcion
nMinThreadsNumerico2Numero minimo de hilos de trabajo
nMaxThreadsNumerico8Numero maximo de hilos de trabajo
nQueueSizeNumerico256Tamano maximo de la cola de tareas pendientes
nActiveThreadsNumerico0Hilos de trabajo activos actualmente (solo lectura)
nPendingTasksNumerico0Tareas en espera en la cola (solo lectura)
EventoCategoriaDescripcion
OnTaskCompleteCiclo de vidaUna tarea termino su ejecucion. Parametros: xResult, nTaskId
OnErrorErrorUna tarea genero un error. Parametros: oError, nTaskId
MetodoDescripcion
Submit( bTask )Anadir una tarea (bloque de codigo) a la cola. Devuelve nTaskId
WaitAll( nTimeout )Esperar a que todas las tareas pendientes se completen
Shutdown()Detener todos los hilos despues de completar tareas pendientes

TAtomicInt CT_ATOMICINT = 68

Entero atomico sin bloqueo. Proporciona operaciones de contador seguras para hilos sin bloqueo explicito.

MetodoDescripcion
Inc()Incrementar atomicamente en 1. Devuelve nuevo valor
Dec()Decrementar atomicamente en 1. Devuelve nuevo valor
Get()Leer valor actual
Set( nValue )Establecer atomicamente a nValue
CompareExchange( nExpected, nNew )Si actual == nExpected, establecer a nNew. Devuelve .T. si se intercambio
Add( nValue )Sumar atomicamente nValue. Devuelve nuevo valor
PlataformaImplementacion Nativa
WindowsInterlockedIncrement / InterlockedCompareExchange
macOS__atomic builtins (GCC/Clang)
Linux__atomic builtins (GCC/Clang)

TCondVar CT_CONDVAR = 69

Variable de condicion. Permite a los hilos esperar hasta que otra hilo senalice una condicion particular.

MetodoDescripcion
Wait( oMutex, nTimeout )Liberar mutex y esperar senal. Readquiere mutex al despertar. Tiempo de espera opcional en ms
Signal()Despertar un hilo en espera
Broadcast()Despertar todos los hilos en espera
PlataformaImplementacion Nativa
WindowsCONDITION_VARIABLE
macOSpthread_cond_t
Linuxpthread_cond_t

TChannel CT_CHANNEL = 70

Canal de mensajes seguro para hilos para comunicacion entre hilos. Inspirado en los canales de Go y la concurrencia CSP.

PropiedadTipoValor predet.Descripcion
nBufferSizeNumerico0Capacidad del buffer (0 = sin buffer/sincrono)
lClosedLogico.F.El canal ha sido cerrado (solo lectura)
MetodoDescripcion
Send( xValue )Enviar un valor al canal. Se bloquea si el buffer esta lleno
Receive()Recibir un valor del canal. Se bloquea si esta vacio
TryReceive( @xValue )Recepcion sin bloqueo. Devuelve .T. si habia un valor disponible
Close()Cerrar el canal. No se pueden enviar mas valores
EventoCategoriaDescripcion
OnReceiveDatosValor recibido (alternativa a sondeo). Parametros: xValue

Ejemplo de Codigo: Patron Productor-Consumidor

// Patron productor-consumidor usando TChannel y TThread

FUNCTION Main()

   LOCAL oChannel, oProducer, oConsumer

   // Crear un canal con buffer de capacidad 10
   oChannel := TChannel():New()
   oChannel:nBufferSize := 10

   // Hilo productor: genera elementos de trabajo
   oProducer := TThread():New()
   oProducer:lFreeOnTerminate := .T.
   oProducer:OnExecute := { || ProduceItems( oChannel ) }

   // Hilo consumidor: procesa elementos de trabajo
   oConsumer := TThread():New()
   oConsumer:lFreeOnTerminate := .T.
   oConsumer:OnExecute := { || ConsumeItems( oChannel ) }

   // Iniciar ambos hilos
   oProducer:Start()
   oConsumer:Start()

   // Esperar a que el productor termine, luego cerrar canal
   oProducer:Wait()
   oChannel:Close()

   // Esperar a que el consumidor procese elementos restantes
   oConsumer:Wait()

   QOut( "Todo listo!" )

RETURN NIL

FUNCTION ProduceItems( oChannel )

   LOCAL n

   FOR n := 1 TO 100
      oChannel:Send( "Tarea #" + Str( n ) )
      QOut( "Producido: Tarea #" + Str( n ) )
   NEXT

RETURN NIL

FUNCTION ConsumeItems( oChannel )

   LOCAL xItem

   DO WHILE ! oChannel:lClosed .OR. oChannel:TryReceive( @xItem )
      xItem := oChannel:Receive()
      IF xItem != NIL
         QOut( "Consumido: " + xItem )
      ENDIF
   ENDDO

RETURN NIL
8 Controles de Hilos

Todas las primitivas de hilos se asignan directamente a las instalaciones nativas del sistema operativo para maximo rendimiento. Use TChannel para comunicacion segura entre hilos en lugar de variables compartidas con bloqueos.

En Esta Página

TThread CT_THREAD = 63 TMutex CT_MUTEX = 64 TSemaphore CT_SEMAPHORE = 65 TCriticalSection CT_CRITICALSECTION = 66 TThreadPool CT_THREADPOOL = 67 TAtomicInt CT_ATOMICINT = 68 TCondVar CT_CONDVAR = 69 TChannel CT_CHANNEL = 70 Ejemplo de Codigo: Patron Productor-Consumidor