Come applicare OOP, principi SOLID e Pattern di progettazione in una libreria che esegue l'elaborazione parallela senza la conoscenza del chiamante?

6

Voglio esplorare le contese tra i due argomenti caldi: Pulisci codice e Buone prestazioni.

(In corso ... per favore pubblica commenti per aiutarmi a scovare i dettagli di questa domanda Grazie.)

Esempi che possono aiutarmi a definire la domanda:

  • Windows GDI + è noto per eseguire lavori su thread separati, che sarebbero accaduti in parallelo al codice utente se eseguiti su un computer multiprocessore.
  • Il COM (Component Object Model) è un framework che offre agli sviluppatori di classi la possibilità di fornire implementazioni parallelizzabili di interfacce, tuttavia i bug che ne derivano non sono inauditi.
  • Un modo per garantire la sicurezza in parallelo è garantire che il lavoro in parallelo avvenga solo all'interno di una singola chiamata al metodo dell'oggetto al livello API più esterno; il metodo non dovrebbe tornare al chiamante fino a quando il lavoro parallelizzato è finito. (Oggetti e metodi che non sono visibili all'esterno possono essere parallelizzati.) Ciò rende necessario costruire un intero gruppo di oggetti volanti solo per separare gli "Oggetti pubblici" dagli "Oggetti Privati"?
  • I principi SOLID incoraggiano l'estensibilità consentendo agli utenti della biblioteca di fornire le proprie implementazioni di interfacce (tramite Dependency Injection). In che modo la biblioteca garantisce che l'implementazione dell'utente soddisfi i requisiti di sicurezza del thread?
    • Il modello a oggetti del componente utilizza "modelli di thread", che è stato un tentativo su questo problema, tuttavia il più delle volte provoca solo deadlock o chiamate di funzioni non riuscite per il motivo che "stai chiamando dall'appartamento thread sbagliato".
posta rwong 09.05.2011 - 01:39
fonte

1 risposta

2

Quando si consente ai chiamanti di specificare una funzione da eseguire, non è possibile garantire che il codice sia sicuro per i thread, almeno in una lingua di uso generale - non c'è nulla per interrompere le variabili di condivisione del codice utente o altrimenti a seconda di particolare ordine di esecuzione. Potresti essere in grado di impostare qualcosa con gli alberi di espressione per disabilitare i riferimenti a qualcosa di diverso dalle variabili locali, ma questo è troppo costoso o ha troppe limitazioni.

Per questo motivo, qualsiasi codice speciale aggiunto per la sicurezza dei thread all'interno della libreria è solo una complessità inutile: specifica nei documenti che le funzioni verranno eseguite su thread diversi senza un ordine particolare e lascialo fare.

Un po 'di attenzione sul design dell'API può essere d'aiuto - se puoi incoraggiare l'uso di funzioni pure, la maggior parte del codice sarà thread-safe senza che l'utente debba pensarci.

    
risposta data 09.05.2011 - 02:39
fonte

Leggi altre domande sui tag