Il codice concorrente (thread, calcolo distribuito, ecc.) può essere trasferito direttamente su piattaforme single-threaded / non-networked?

2

Prendi un programma multi-threaded "perfetto" arbitrario, su una piattaforma multi-threaded arbitraria, usando un linguaggio di programmazione arbitrario.

Supponendo che questo "perfetto" programma multi-thread:

  • è impeccabile in termini di condizioni di gara
  • gestisce perfettamente la memoria condivisa
  • potrebbe / non usare un meccanismo di blocco (sospensione del thread o mutex rientrano in questa categoria)
  • non ha bug imprevisti (100% senza bug)
  • non usa costrutti complicati di linguaggio / sistema che non possono essere tradotti in un altro sistema in qualsiasi circostanza

e assumendo che questa piattaforma arbitraria

  • è / non è conforme a POSIX (non importa)
  • utilizza un modello di thread familiare
  • non trasforma il meccanismo di blocco in un vortice di codici spaghetti voodoo (probabilmente)

e assumendo questa lingua arbitraria

  • non utilizza costrutti di thread specifici del dominio (come la parola chiave synchronized di Java)
  • è platform agnostico al nucleo (come C e varianti)
  • può essere compilato in modo incrociato su molte architetture / piattaforme diverse (non è limitato alla piattaforma attiva)

il codice intrinsecamente può essere implementato in modo che venga eseguito come previsto su una piattaforma single-threaded ?

Ad esempio, al posto dei thread la piattaforma a thread singolo utilizza un modello simile alla co-routine per simulare i thread. Esiste un difetto di progettazione fondamentale con tali concetti che inibirebbe la possibilità di eseguire il programma in questo ambiente thread-absent / thread-emulato?

La risposta a questa ampia domanda è molto specifica per la piattaforma, ma come ho accennato prima mi interessa sapere se esiste una proprietà intrinseca con multi-threading che li rende impossibili da porta agli ambienti senza thread.

Inoltre (e più concretamente), ci sono piattaforme / architetture specifiche mainstream che non consentirebbero uno scenario simile?

    
posta Qix 01.12.2014 - 07:11
fonte

1 risposta

2

Esistono due tipi principali di multitasking:

  • Cooperativa - dove il codice chiama esplicitamente una funzione per dire "fai qualcos'altro ora"
  • Pre-emptive - in cui il sistema di threading interrompe automaticamente un thread per consentire a un altro di eseguire

In questi giorni, la maggior parte del codice multitasking è preventiva, sebbene il codice basato sugli eventi (ad esempio Twisted ) sia cooperativo. Ricordo di aver usato Visual Basic negli anni '90 e all'interno di lavori di lunga durata, dovendo effettuare chiamate a DoEvents. Quello era il multitasking cooperativo.

La distinzione è importante, perché se la tua app è codificata per il multitasking preventivo, non puoi cambiarla in cooperativa, a meno che non apporti modifiche sostanziali. In questo senso, la risposta alla tua domanda è no - non puoi prendere un programma threaded preventivo e farlo funzionare in modo cooperativo usando le coroutine.

Tuttavia, se il tuo sistema operativo fornisce una funzione di allarme a grana fine, di solito è possibile scrivere la tua libreria di threading preventiva. In parole povere, hai un allarme ogni 50ms circa e passa al thread in attesa successivo. Quindi, in questo senso, la risposta è - si inizia scrivendo una libreria di threading preventiva per la piattaforma a thread singolo, quindi si porta l'applicazione abbastanza facilmente.

    
risposta data 01.12.2014 - 11:20
fonte