Accept () est-il thread-safe?

J’écris actuellement un simple serveur Web en C pour un cours que je suis en train de faire. Une des conditions est que nous implémentions un pool de threads pour gérer les connexions à l’aide de pthreads.

Je sais comment procéder pour y arriver à peu près (appeler accept dans un fil principal et passer le descripteur de fichier à un fil libre), mais mon ami m’a suggéré une autre méthode que celle que j’avais en tête: créer tous mes fils à l’avant, et les faire tous en boucle pour un appel à accepter. L’idée étant que accept va bloquer tous les threads inactifs et lorsqu’une connexion est établie, ne donner que le descripteur de fichier à un. Ensuite, lorsqu’un thread donné est établi avec une connexion, il effectue une boucle et bloque l’appel pour l’accepter à nouveau. Utiliser l’appel pour accepter () essentiellement comme un sémaphore. Cela simplifierait un peu la mise en œuvre, car vous n’avez pas besoin de savoir quels threads sont occupés et lesquels sont prêts pour une connexion. En théorie, ce serait également une latence plus faible, car le thread peut immédiatement commencer à s’exécuter.

Ma question est, est-ce sécuritaire? Je prévois de le mettre en œuvre et de l’essayer, mais je ne suis pas encore prêt et je suis assez curieux de connaître la réponse. J’ai cherché sur google et ici sur stackoverflow, mais je n’ai trouvé personne qui le fasse de cette façon. Accepter le fil est-il sûr? Je suppose que cette approche entraînera davantage de frais généraux, car vous exécutez tous vos threads tout le temps. S’agit-il d’un simple compromis entre mémoire et latence?

Edit: Je ne sais pas si cela devrait être un wiki de la communauté, excusez-moi, mais je ne trouve pas le bouton: P

    Oui. C’est un moyen courant de concevoir des serveurs multithread et une pratique de conception acceptée.

    Vous pouvez également fork plusieurs fois des fork et demander à l’appel de processus enfant d’ accept , ce qui vous permettra de faire du multithreading sans avoir besoin d’une bibliothèque de threads. Les serveurs plus anciens font cela.