[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