2011-10-07 13 views
21

Sto cercando alcuni problemi di concorrenza semplici e canonici, adatti a dimostrare l'utilizzo di una libreria per calcoli simultanei su cui sto lavorando.Che cos'è il "Hello World" dei programmi concorrenti?

Per chiarire cosa intendo per "concorrenza": mi interessano algoritmi che utilizzano processi di comunicazione non deterministici, non in es. la creazione di algoritmi come quicksort può essere eseguita più rapidamente distribuendo il lavoro su più processori. This è come sto usando il termine.

Conosco lo Dining Philosophers Problem e ciò sarebbe accettabile, ma mi chiedo se ci siano altri problemi convincenti ma ugualmente semplici.

risposta

6

Generalmente utilizzo un semplice scenario di "trasferimento bancario". Ad esempio, ho pubblicato uno di questi casi banali in this question on transactions.

E 'un buon caso per l'esposizione, perché:

  • Tutti capiscono il problema di business.
  • Sottolinea le importazioni di transazioni in un ambiente concorrente.
  • Si può facilmente estendere lo scenario (ad esempio, cosa succede se si vuole calcolare la somma di tutti i saldi di conto corrente, mentre le transazioni sono in corso?)

Per dimostrare la libreria concorrenza, probabilmente si potrebbe avviare un thread in esecuzione milioni di transazioni in questo tipo di scenario e dimostrare come altri thread possono ancora vedere una visione coerente del mondo ecc.

+0

Grazie! Anche se è un po 'asciutto, penso che questa sia la migliore delle risposte finora. – jberryman

3

Non penso che ci sia un primo programma standard per dimostrare che la concorrenza funziona, come "Hello world" per programmi sequenziali.

Più tipici della concorrenza sono i programmi che presentano problemi, ad esempio i contatori concorrenti che perdono alcuni conteggi senza una sincronizzazione corretta. O trasferimenti casuali tra conti bancari che causano un deadlock se il blocco è fatto in modo ingenuo. (L'ho fatto quando giocavo con la concorrenza Java.)

Una cosa che dimostra la concorrenza ed è relativamente semplice è contare in modo cooperativo: i thread concorrenti (o qualsiasi altra cosa) hanno un contatore interno, che inviano l'uno all'altro, e impostare su ciò che ricevono più uno. (L'ho fatto con tre LEGO Mindstorms RCX su infrarossi qualche anno fa, ha funzionato bene.)

BTW: Il "mondo Hello" del programmatore incorporato è il LED lampeggiante.

+2

Soprattutto se lo fai lampeggiare "CIAO MONDO" in Morse. –

1

È possibile tracciare i raggi "Ciao" e "Mondo" in thread separati. Oppure animare "Ciao" mentre "Mondo" è raytracing.

3

C'era un esempio di applet Java (probabilmente ancora è) che si utilizzava per testare quale programmazione algoritmo utilizzato da JVM e dal sistema operativo sottostante. Ha animato due barre (o facoltativamente più? Non ricordo) gradualmente riempite, ciascuna animata da un thread diverso con la stessa priorità.

Un equivalente che consente di stampare:

red 1 
red 2 
green 1 
red 3 
green 2 

ecc alla console, mi sembra essere la cosa più vicina nello spirito alla ossa nude natura del "ciao, mondo". Cioè: "posso fare in modo che il computer faccia qualcosa di inutile ma visibile?"

Quindi in ogni thread si vorrebbe una serie di pause (o loop di occupato o sleeps, fino a te e che si potrebbero influire sull'output a seconda di come è pianificata la concorrenza), ciascuna seguita da qualche output. Potresti voler sincronizzare l'output, non veramente essenziale, ma se una riga dovesse essere suddivisa dallo scheduler sarebbe imbarazzante da leggere.

Quindi, se il modello di concorrenza è cooperativo (thread neolitici, o forse qualcosa basato su co-routine), è necessario aggiungere anche rese idonee, per impedire il riempimento della barra rossa prima dell'avvio della barra verde. Questo ti dice che hai reso efficacemente il tuo codice concorrente interlacciato.