Che pratica di filettatura è buona il 90% delle volte? [chiuso]

2

Poiché il mio thread SO è stato chiuso i Credo di poterlo chiedere qui.

Quali pratiche o pratiche sono buone il 90% delle volte quando si lavora con threading con più core? Personalmente tutto ciò che ho fatto è stato condividere classi immutabili e passare (copiare) i dati in una coda al thread di destinazione.

Nota: Questo è per la ricerca e quando dico il 90% delle volte non intendo che sia possibile fallire il 10% delle volte (è ridicolo!) intendo il 90% è una buona soluzione mentre l'altro 10% non è così desiderabile a causa dell'implementazione o di ragioni efficienti (o semplicemente un'altra tecnica si adatta molto meglio al dominio del problema).

    
posta Community 08.01.2011 - 02:09
fonte

6 risposte

6

La soluzione al 90% che utilizzo è multiprocessing. Sul serio. Niente condiviso. Passa oggetti "immutabili" da stdout su un processo a stdin sull'altro processo.

Fai in modo che il sistema operativo lo gestisca.

Dato che l'API esiste da decenni, è molto, molto semplice da implementare.

    
risposta data 08.01.2011 - 02:16
fonte
4

Quello che stai facendo è già abbastanza buono.

Ho notato che non hai menzionato una lingua o una piattaforma; ma in generale, un ambiente a niente condiviso, che trasmette messaggi si ridimensiona molto bene, a patto che non lo faccia anche chiacchierone .

Se puoi evitare la sincronizzazione se non per la coda e la coda delle code, evita il 90% dei problemi che si verificano.

Good Luck

    
risposta data 08.01.2011 - 02:21
fonte
4

Avvocato del diavolo: ignora il multi-threading finché non hai alternative. Sono serio in questo essendo la soluzione "90%" a causa dello sforzo di progettare, scrivere, verificare e mantenere funzionalità multi-threaded. Non ne vale la pena in tutte le applicazioni, ma le più affamate di prestazioni.

So che non fornisce la risposta che ti piace, ma ho sentito che dovrebbe essere menzionato.

    
risposta data 26.01.2011 - 22:11
fonte
1

Lascia che un thread mantenga un solo blocco alla volta. Ciò eviterà tutti i problemi di deadlock, ma non è possibile eseguire alcune attività in questo modo. Lo spegnimento aggraziato sembra un posto in cui è necessario scrivere codice in cui un thread contiene un blocco e desidera bloccare qualcos'altro.

La regola generale per fare ciò sarebbe mantenere un blocco solo per il più piccolo numero di righe di codice possibile. Ma devi ancora pensarci.

    
risposta data 26.01.2011 - 22:03
fonte
1

Faccio calcoli scientifici e uso il multithreading principalmente per il parallelismo piuttosto che per la concorrenza, quindi la mia soluzione al 90% consiste nell'utilizzare costrutti di parallelismo estremamente "locali" in modo che le parti multithread siano piccole e facili da ragionare. In altre parole, la maggior parte del programma può essere ragionata in modo seriale come se fosse un thread singolo, e il multithreading viene solo portato, per esempio, usando un foreach parallelo in un ciclo intermedio in alcune parti critiche per le prestazioni del mio codice.

Oppure, all'estremo opposto, il multithreading può essere introdotto solo nel ciclo molto più esterno, in cui le iterazioni del ciclo sono sostanzialmente completamente indipendenti.

    
risposta data 26.01.2011 - 22:21
fonte
0

Per le applicazioni aziendali la maggior parte delle volte dipende dal framework di livello superiore per ottenere un uso efficace di più processori / core server. Per esempio. Usando ASP.Net non dovresti avere codice per il multithreading esplicito (eccetto possibilmente la condivisione di cache statiche) ma affidarti al framework ASP.Net per utilizzare efficacemente i core disponibili per soddisfare le richieste. Lo stesso può essere applicato anche ai servizi WCF.
Assumerei lo stesso per i server di applicazioni Java ecc.

    
risposta data 26.01.2011 - 22:38
fonte

Leggi altre domande sui tag