2010-10-24 8 views
0

Aujourd'hui, j'ai eu l'idée de créer un ThreadQueue pour C++, pour mon application serveur.ThreadQueue - Développement pour serveurs - C++

unsigned int m_Actives; // Count of active threads 
unsigned int m_Maximum; 

std::map<HANDLE, unsigned int> m_Queue; 
std::map<HANDLE, unsigned int>::iterator m_QueueIt; 

Dans une discussion supplémentaire plût à gérer ces temps:

while(true) 
{ 
    if(m_Actives != m_Maximum) 
    { 
    if(m_Queue.size() > 0) 
    { 
    uintptr_t h = _beginthread((void(__cdecl*)(void*))m_QueueIt->first, 0, NULL); 
    m_Actives++; 
    } 
    else 
    { 
    Sleep(100); // Little Cooldown, should it be higher? or lower? 
    } 
    } 
} 

m_Maximum est setable et est le nombre de threads Maximal. Je pense que cela devrait fonctionner, mais maintenant j'ai besoin d'attendre pour chaque thread qui est actif et doit vérifier si elle est terminée/en vie ou non. Mais pour cela j'utiliserais WaitForSingleObject. Mais alors j'ai besoin de 1 Thread par Thread. Donc 2 fils. Dans le quelque chose est géré. Dans l'autre, attendez que le 1 Thread soit sorti.

Mais je pense que c'est vraiment mauvais. Qu'est-ce que tu ferais?

+0

Assez intéressant que votre conception ne comprend rien sur les fonctions de fil. Qu'est-ce que ces fils sont supposés faire? Le premier paramètre de _beginthread doit être un pointeur vers la fonction qui doit être exécutée dans le thread. –

+0

m_queue contient un pointeur sur les fonctions. les pointeurs doivent faire Envoi et réception + manipulation de sockets .. Demandes – Aurus

+0

Pouvez-vous utiliser WaitForMultipleObjectsEx() pour attendre que tous les threads soient terminés? – skimobear

Répondre

0

Vous pouvez utiliser WaitForMultipleObjects pour attendre que l'un des threads démarrés soit terminé.

Ou, ce qui est probablement mieux dans ce cas dans chaque thread, vous pouvez envoyer un événement avant de l'arrêter. Que, le thread de moniteur doit seulement attendre et traiter cet événement.

Mais, pour être honnête, votre description et la source est plutôt délicate ....