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?
9
A
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.
Problemi correlati
- 1. Combinazione di canali sicuri e non protetti
- 2. I filetti di Kotlin sono sicuri?
- 3. I thread client proxy CXF sono sicuri?
- 4. Haskell, Canali, STM, -threaded, Message Passing
- 5. I riferimenti const ai membri sicuri sono
- 6. Estensioni Crossrider - sono sicuri
- 7. sono canali passati per riferimento implicitamente
- 8. Sono strtol, strtod non sicuri?
- 9. Perché gli alberi di espressione sono più sicuri del riflesso?
- 10. Quanto sono sicuri e affidabili i letterali di stringa C++?
- 11. Proprio quando non sono sicuri, #., E. # Non sicuri?
- 12. interruzione dell'istruzione di selezione quando tutti i canali sono chiusi
- 13. Come implementare l'equivalente dell'istruzione select di Go per i canali Haskell STM?
- 14. Aiuto sessione CodeIgniter, i cookie non sono sicuri?
- 15. I thread di inizializzazione statici Java sono sicuri?
- 16. Quanto sono sicuri i file SQLite e SharedPreferences su Android?
- 17. I metodi statici con argomenti out thread sono sicuri?
- 18. Eliminazioni di array sicuri per i thread
- 19. Socket.IO sottoscrizione a più canali
- 20. I metodi SetValue/GetValue di System.Array sono sicuri per i thread?
- 21. Quali attributi html/css sono sicuri per posta?
- 22. Quali sono alcuni dei modi più sicuri per connettersi a un database con PHP?
- 23. riconnettersi automaticamente i canali RabbitMQ
- 24. Tutti i funtori funzionali Haskell sono?
- 25. I modelli aritmetici sono legali Haskell?
- 26. Come posso unire i canali in rabbitmq?
- 27. È possibile multiplexare più canali in uno?
- 28. Come vengono implementati i canali Go?
- 29. Il modo più semplice per leggere i campioni a 2 canali nell'array da WaveStream
- 30. Come attivare i cookie sicuri in Wildfly?
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. –
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). –
Non conoscevo i semafori nella piattaforma di haskell, la ringrazio molto per averlo fatto notare. Sostituirò sicuramente i canali con loro. –