I am making a little program, which have few Threads, constantly running. At some point, I may want to stop one of them, and then, after random period of time, to start it again. What is the best way to create a thread?
Il modo migliore è non farlo affatto. Se ho un lavoro che deve essere fatto in parallelo con un altro programma, la migliore pratica è quella di avviare un altro processo . Se ho un lavoro che deve essere fatto in modo asincrono, allora uso la Task Parallel Library e lascia che gestisca i miei thread.
I thread sono semplicemente l'unità sbagliata di granularità per la maggior parte delle attività. I thread sono worker ; invece di gestire worker , gestisci invece tasks ; lascia che il TPL capisca quanti lavoratori sono necessari.
mostly I am asking about stability (meaning error-proof)
Il threading code è notoriamente difficile da correggere. Devi preoccuparti della coerenza, delle barriere della memoria, delle letture e scritture non atomiche, dei deadlock, dei livelock, ... Ecco perché usare i processi è di gran lunga migliore.
Se devi tenere tutto in un unico processo, usa lo strumento livello più alto disponibile. Ancora una volta, non tentare di manipolare direttamente i thread. Se hai un lavoro asincrono da fare, usa il TPL. Se hai bisogno di cancellare parte di quel lavoro, usa i token di cancellazione. Non tentare di controllare direttamente le discussioni; ti sbaglierai.
Se per qualche motivo non si desidera utilizzare la TPL e si desidera utilizzare direttamente i thread, quindi creare uno schema in cui i thread comunicano attraverso canali ben definiti e testati e far revisionare il codice da esperti. Non si vuole mai interrompere un thread se non in condizioni di emergenza; così facendo puoi corrompere le tue strutture dati in modi insoliti. Se hai bisogno di chiudere un thread, allora devi avere un sistema attentamente progettato e implementato con cura che permetta a un thread di segnalare chiaramente un altro thread che è ora di spegnersi e che il thread si chiuda in modo pulito.
and maximum performance (as low CPU usage as possible, and as less memory allocation as possible)?
Non capisco mai perché la gente dice "Voglio usare i thread per mantenere basso l'utilizzo della mia CPU". I thread sono lì per mantenere l'utilizzo della CPU alto . Hai pagato un buon prezzo per quelle CPU; usali! La situazione ideale è avere tutte le CPU della macchina che vanno sempre al 100% facendo un lavoro utile. Non diresti che il tuo obiettivo era costruire una fabbrica dove i lavoratori erano inattivi il 95% delle volte, quindi perché dovresti fare lo stesso per un programma?
I thread mantengono alto l'utilizzo della CPU perché, se sei intelligente, assegnerai un thread di lavoro con CPU a ogni CPU, e avrai quella nient'altro diversa dal lavoro sul problema che ci provi. Se hai un lavoro più legato alla CPU rispetto alle CPU e più thread per gestirlo, le CPU passeranno avanti e indietro tra i thread e tutto diventerà meno efficiente.
Se si desidera evitare l'allocazione di memoria, mantenere sempre il numero di thread il più basso possibile. I thread riguardano la maggior parte delle risorse costose di memoria che è possibile allocare. Ciascuno di default consuma un milione di byte di spazio indirizzo per lo stack.