2012-03-08 15 views
9

Ho bisogno di mettere insieme un sistema concorrente con uno Control.Concurrent.Chan condiviso tra i thread. Ci sarà un solo consumatore e molti produttori. Guardando il Chan documentation non ho visto alcun avviso sul numero di consumatori e produttori che potrebbero funzionare sullo stesso canale, e il codice sorgente sembra utilizzare gli accessori "sicuri" predefiniti per MVar s, quindi penso che dovrebbe essere sicuro di presumere che non ci dovrebbero essere limitazioni ma non ne sono sicuro. Quindi, la mia domanda è ... sai se i canali haskell sono sicuri (in generale) per più lettori e produttori, per favore?I canali haskell `Control.Concurrent.Chan` sono sicuri per più lettori/produttori?

risposta

11

Sono sicuri per qualsiasi numero di thread. Sono una semplice lista collegata basata su MVar. I compromessi di progettazione consentono di dupChan che aiutano nel caso opposto di trasmettere a più lettori.

Il Chan è così semplice che non conta il numero di oggetti all'interno, né ha un limite superiore. Quindi, se i produttori superano il consumatore, il Chan diventerà molto grande. Se questo è un problema, potresti accoppiare il Chan con un (MVar Int). e fare in modo che produttori e consumatori modifichino il totale parziale degli articoli nel Chan.

+0

Bene, grazie. L'assenza di un limite superiore non è un problema nel mio caso perché ogni thread invierà un solo messaggio, al termine. È una struttura semplice che userò per fare in modo che il thread principale attenda i messaggi N (se N è il numero di thread) dal canale prima di procedere. –

+0

Una barriera contata come questa sembra un semaforo di quantità, è possibile sostituire la lunghezza della lista collegata di Chan con MSem o MSemN in http://hackage.haskell.org/package/SafeSemaphore usando una quantità iniziale di (1-N). –

+0

Non conoscevo i semafori nella piattaforma di haskell, la ringrazio molto per averlo fatto notare. Sostituirò sicuramente i canali con loro. –

Problemi correlati