Problema de concurrencia con socket::Client

8 views
Skip to first unread message

Raúl Andrés

unread,
Jun 23, 2010, 3:45:14 AM6/23/10
to NemesisRD 1.x
Buenos días:

Tenemos un problema de concurrencia con socket::Client:

En nuestro escenario, uno de los threads (A) escucha peticiones por un
socket entrante, mientras que otro (B) se encarga de escribir las
respuestas en el mismo socket.

El problema que hemos localizado es que el siguiente:

Después de procesar una petición, el thread B invoca a
socket::send(...), que manda la respuesta al cliente, y pierde el
foco.

El cliente que nos manda las peticiones es muy muy rápido, y decide
cerrar el socket inmediatamente después de recibir la respuesta.

El thread A recibe el paquete de cierre (TCP FIN), lo procesa, y
destruye el socket y devuelve el foco.

El thread B recupera el foco, y continúa en send(...). Como el thread
A destruyó la estructura, se produce un desastre.

Alguna idea?

Cisco

unread,
Jun 24, 2010, 6:31:57 AM6/24/10
to NemesisRD 1.x
Bueno, esos threads A y B, están compartiendo el acceso al socket
entrante (llámalo SS) cuyo gestión está delegada en el thread A.

Supongo que cuando B tiene que contestar se obtendrá un contexto y
entre otras cosas tendrá el socket SS, que le indicará a quién y por
dónde tiene que contestar.

Resumiendo que estás tratando un mismo socket por dos threads
distintos.

El núcleo intenta favorecer el rendimiento así que minimiza el número
de secciones críticas y supone que ningún socket va a ser compartido.
Si como es tu caso, el socket necesita ser compartido por varios
thread debes avisar al núcleo de comunicaciones, y configurar ese
socket SS para que se proteja de acceso simultáneos.

Así que tendrás que invocar al método
comm::socket::Client::setWorkMode con el valor
comm::socket::Client::WorkMode::Shared antes de guardar el socket en
el contexto que usarás luego al recibir la respuesta.

Ojo, en versiones anteriores la documentación avisaba de que había que
completar las secciones críticas, en las últimas versiones de la
plataforma de comunicaciones no hay que hacer nada, sólo activar el
modo compartido y ya está. Así que asegurate de que no estás
activando ninguna SSCC que colisione con las del núcleo.

Un saludo.
Reply all
Reply to author
Forward
0 new messages