Thread & Semaphore

Résolu
theGrimReaper Messages postés 25 Date d'inscription dimanche 31 octobre 2010 Statut Membre Dernière intervention 18 janvier 2014 - 10 janv. 2014 à 15:56
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 28 juin 2016 à 17:00
Bonjour,

Je voudrais vérifier avec vous si j'ai bien compris un principe de base du multithreading.

Je prends mon exemple. Je dois créer un proxy. Sauf que je veux lui imposer une contrainte de connexions maximum simultanées pour les clients.
L'idée c'est donc d'utiliser un semaphore sur des threads qui gère les connexions.
Mais le truc, c'est que mon sémaphores va limiter le nombre de thread (le nombre de connexion) lancés en même temps.

Prenons l'exemple d'un nombre max de 5. Si un 6ième client ce connecte, il doit être mis en attente. Donc il faut qu'un thread le capte, mais attende d'avoir le feu vert de la semaphore n'est ce pas ??!

En plus clair,
dois-je avoir plus de thread pour récupérer les connexions clients, que le nombre max de connexion défini pour ma semaphore ?

Un élément de réponse :
Je pense qu'il faudrait que je sinde la partie écoute de connexions client, avec celle du traitement des requêtes des clients. Et ainsi pouvoir appliquer mon sémaphore qu'au traitement et laisser libre le nombre de connexions clients. Il seront juste mis en attente par la semaphore qui devrait réguler le nombre de traitement simultannées...
Suis-je à côté de mes pompes, ou non ?! :p


Merci d'avance pour votre aide.

NotaBene : Vu que c'est une question de compréhension et que je pense avoir expliqué la chose correctement. Je ne pense pas avoir à vous montrer un bout de code. Surtout que pour le moment je réfléchie à mon projet. J'ai rien commencé.
Mais s'il vous en faut un absolument, je pourrai toujours écrire un p'tit truc vite fait pour illustrer (encore une fois j'en vois pas trop l'intérêt).
A voir également:

21 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 30/06/2016 à 17:18
Bonjour.

Je te confirme que j'existe toujours (enfin je crois... ^^). Je n'ai pas été super rigoureux partout dans mon exemple, et effectivement, si on veut faire les choses proprement, il faudrait vérifier le retour du write et gérer de grosses écritures (qui nécessitent plusieurs write). L'exemple donné prenant en compte de petites commandes, je ne m'en suis pas aperçu (mais j'aurais dû "tilter" en voyant un appel système sans vérification :p).

Remplace:
write(fd, res, strlen(res));

par:
count = strlen(res);
for (int n = 0; n < count; )
{
  int ret = write(fd, res + n, count - n);
  if (ret < 0)
  {
    if (errno == EINTR || errno == EAGAIN)
      continue; // try again
    perror("write");
    break;
  }
  else
    n += ret;
}


Attention, je fais le code de tête, je ne l'ai pas testé !


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Rejoignez-nous