Sto scrivendo una classe del pool di thread in C++ che riceve le attività da eseguire in parallelo. Voglio che tutti i core siano occupati, se possibile, ma a volte alcuni thread sono inattivi perché sono bloccati per un periodo di sincronizzazione. Quando ciò accade vorrei iniziare una nuova discussione, in modo che ci siano sempre all'incirca tanti thread quanti sono i core della CPU. A questo scopo ho bisogno di un modo per scoprire se un determinato thread è sveglio o sta dormendo (bloccato). Come posso scoprirlo?C'è un modo per scoprire se un thread è bloccato?
Preferirei utilizzare la libreria standard C++ 11 o boost per scopi di portabilità. Ma se necessario, utilizzerei anche WinAPI. Sto usando Visual Studio 2012 su Windows 7. Ma davvero, mi piacerebbe avere un modo portatile per farlo.
Preferibilmente questo thread-pool dovrebbe essere in grado di dominare casi come
MyThreadPool pool;
for (int i = 0; i < 100; ++i)
pool.addTask(&block_until_this_function_has_been_called_a_hundred_times);
pool.join(); // waits until all tasks have been dispatched.
dove la funzione block_until_this_function_has_been_called_a_hundred_times()
blocchi fino 100 fili hanno chiamato. A questo punto tutti i thread dovrebbero continuare a funzionare. Un requisito per il pool di thread è che non dovrebbe deadlock a causa di un numero troppo basso di thread nel pool.
Si potrebbe misurare l'utilizzo della CPU al momento, suppongo. Ma a meno che i blocchi non siano molto lunghi (è possibile mantenere le statistiche su "per quanto tempo dormo" se si dispone di un wrapper per i blocchi), probabilmente sarà necessario più tempo per iniziare un nuovo thread rispetto al thread bloccato. Non sono a conoscenza di alcun modo standard per farlo. –
Cosa intendi per bloccato? Se alcuni dei tuoi thread sono inattivi perché sono bloccati, come fa l'avvio di un altro thread, non sarà inattivo in attesa della stessa risorsa dei thread esistenti? Come dice @MatsPetersson, puoi misurare i tempi di inattività dei tuoi thread, ma forse devi misurare il throughput della tua risorsa per mantenere i tuoi thread più occupati possibile. – dwxw
Perché preoccuparsi? Assicurati che il pool, o qualsiasi altra cosa, abbia un numero sufficiente di thread aggiuntivi. –