2010-12-08 36 views
1

Dans l'exemple 3 du serveur HTTP (boost 2.44), le service IO est créé sans indicateur de nombre de threads. Sous Windows, on passe normalement le nombre de thread à CreateIoCompletionPort(). boost: asio a un ctor Service IO qui prend le nombre de threads, mais ce ctor n'est pas utilisé dans cet exemple. Et le nombre de threads est connu.boost: asio Exemple de serveur HTTP 3 threads (version Windows)

Ma question est la suivante: existe-t-il une raison pour créer le service IO sans le nombre de threads? Est-ce que boost: asio suppose qu'on ne créerait jamais plus de threads qu'un par core? Notez que si le nombre de threads transmis à CreateIoCompletionPort() est zéro, le système autorisera un thread par core exécutant des threads simultanément.

+0

Quelqu'un change le titre. "boost :: asio :: io_service() concurrency_hint question Windows" Serait un bon titre. Alors d'autres peuvent google plus facile. – unixman83

Répondre

0

Lorsque vous appelez le paramètre moins constructeur sur io_service, l'appel à CreateIoCompletionPort vents en utilisant un nombre de threads de 0xffffffff dans le code ici:

void win_iocp_io_service::init(size_t concurrency_hint) 
{ 
    iocp_.handle = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 
     static_cast<DWORD>((std::min<size_t>)(concurrency_hint, DWORD(~0)))); 
    if (!iocp_.handle) 
    { 
    DWORD last_error = ::GetLastError(); 
    boost::system::error_code ec(last_error, 
     boost::asio::error::get_system_category()); 
    boost::asio::detail::throw_error(ec, "iocp"); 
    } 
} 

Je ne sais pas comment Windows interprète cela, mais l'appel fonctionne OK , donc je suppose que c'est la même chose que d'utiliser 0. Je suppose que l'hypothèse est que l'OS sait le mieux?

+0

Zéro signifie que le système d'exploitation permet à la plupart des threads du nombre de core de s'exécuter simultanément. C'est bien, mais certaines personnes préfèrent deux threads par cœur par défaut. Pour moi, il serait plus logique d'utiliser le nombre de threads, qui est connu. – user535714

+0

Oui, la solution serait d'utiliser un constructeur différent. Probablement juste en gardant le code d'exemple simple. –

+0

C'est probablement ça. J'aimerais qu'ils le disent. – user535714

0

Lorsque concurrency_hint n'est pas spécifié pour boost:asio::io_service() constructeur. La valeur par défaut est infinie ou sans limite, ce qui n'est jamais la meilleure pratique. Mais le concepteur a probablement estimé que l'attribut concurrency_hint de Windows était inutile, de sorte que la valeur par défaut était compatible avec toutes les plates-formes (aucune limite). Cela est susceptible d'être cohérent avec la façon dont les autres systèmes d'exploitation interprètent cette valeur.

Étant donné que Windows lui-même ne crée aucun thread à partir de ce fiasco, il ne devrait même pas s'en soucier. concurrency_hint doit être renommé max_allowed_concurrency_on_Windows