[C con Clase] VIDA O MUERTE (concurrencia)
Juan Pablo Freeckman
elpibe_ en hotmail.com
Mie Feb 21 10:48:39 CET 2007
Bueno, al parecer tenia bastantes fallos en el codigo que expuse sobre la
gestion de hilos. Tengo hasta el domingo antes de que me cateen para
cambiarlo. Debo hacer una llamada a un hilo cada vez que se conecte un
cliente. Como maximo pueden ejecutarse hasta 5 hilos a la vez. Dentro de un
hilo se ejecuta la función ZGestionComandos() que implementa la
funcionalidad basica del servidor y retorna 0 cuando un cliente solicita
desconexion. Cuando se desconecta un cliente(y a continuacion se cierra el
hilo), tendre que decrementar alguna variable para saber en todo momento el
nº de clientes conectados. Asi por ejemplo, si tenia 5 clientes
conectados(no debo permitir la entrada a ninguno mas), y se desconecta uno,
entonces habran 4 conectados, y podre permitir la conexion de 1 mas. Tambien
me interesa tener conocimiento de cuando se intenta conectar un 6º cliente
para poder enviarle un mensaje que le informe de que el servidor esta lleno.
El servidor es de ftp.
Que añadiriais y cambiariais vosotros al codigo? debo basarme para
resolverlo en el tipico problema de productor-consumidor?
#define NUMERO_THREADS 4
int _tmain(int argc, _TCHAR* argv[])
{
...
ClientesActivos = 0; //de momento no hay clientes activos
while(ClientesActivos <= NUMERO_THREADS)
{
//ESPERO UNA CONEXION
ServiceSocket = accept(ListeningSocket, NULL, NULL);
if (ServiceSocket == INVALID_SOCKET)
return 0;
//CREO UN HILO POR CONEXION ACEPTADA
hThread = CreateThread(NULL, 0, WorkerThread,(LPVOID)ServiceSocket, 0,
NULL);
if (hThread == NULL)
return 0;
}//WHILE
return 0;
} //main
DWORD WINAPI WorkerThread(LPVOID lpParam) //HILO
{ int Conexion;
SOCKET ServiceSocket=(SOCKET) lpParam;
Conexion=ZGestionComandos(ServiceSocket);//RECIBE COMANDOS DEL CLIENTE
if(Conexion == 0){
printf("CLIENTE DESCONECTADO\n");
return 0;}
return TRUE;
}//WorkerThread
>From: Programante <programante en gmail.com>
>Reply-To: Lista de correo sobre C y C++ <cconclase en listas.conclase.net>
>To: Lista de correo sobre C y C++ <cconclase en listas.conclase.net>
>Subject: Re: [C con Clase] VIDA O MUERTE (concurrencia)
>Date: Sun, 18 Feb 2007 13:45:37 +0100
>
>Otro detalle que deberías tener en cuenta es que el compilador podría
>"optimizar" el uso de ciertas variables
>
> while(clienteactivos >=4)
> {sleep(10000);}
>
>Si el código en ensamblador es
>bucle:
> mov eax, clienteactivo
> cmp eax, 4
> jl salir_bucle
> push 10000
> call sleep
> jmp bucle
>salir_bucle:
>
>
>Podría cambiarlo por:
> mov eax, clienteactivo
>bucle:
> cmp eax, 4
> jl salir_bucle
> push 10000
> call sleep
> jmp bucle
>salir_bucle:
>
>basándose en que clienteactivo no cambia de valor dentro del bucle. En
>este caso no podría darlo por supuesto, ya que al llamar a otra función,
>esta podría modificar el contenido de cualquier variable global.
>
>Para evitar esta clase de "sucesos", clienteactivo debería declararse
>como 'volatile'.
>
>Además, ANSI C define el tipo de dato entero *sig_atomic_t*, que
>garantiza que se puede modificar atómicamente, incluso en presencia de
>interrupciones.
>No obstante, lo normal es que los tipos de datos hasta enteros, así como
>los punteros se acceden de forma atómica. "Both of these assumptions
>are true on all of the machines that the GNU C library supports and on
>all POSIX systems we know of."
>(http://www.delorie.com/gnu/docs/glibc/libc_496.html)
>
>_______________________________________________
>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
_________________________________________________________________
Descarga gratis la Barra de Herramientas de MSN
http://www.msn.es/usuario/busqueda/barra?XAPID=2031&DI=1055&SU=http%3A//www.hotmail.com&HL=LINKTAG1OPENINGTEXT_MSNBH
Más información sobre la lista de distribución Cconclase