Esiste un'implementazione nota di Haskell MVar
in C? C'è un example su come implementarlo in C++. Ma, mi piacerebbe implementarlo in C - diciamo solo l'equivalente MVar CInt
in C per ora. Scrivere primitive di sincronizzazione può essere complicato. Quindi, mi piacerebbe evitare la duplicazione degli sforzi se qualcuno l'ha già fatto. Non ho capito bene l'esempio C++ sopra abbastanza per tradurlo in modo sicuro in C - nasconde i dettagli algoritmici molto bene dal mio C++ - mente inesperta :)Implementazione di MVar in C?
Il motivo per cui sto pensando di scrivere MVar in C è perché rende davvero facile per me utilizzare l'associazione FFI a una libreria C esterna per ottenere il flusso di dati e utilizzare i thread Haskell per acquisire i dati (dai vettori memorizzabili per evitare il marshalling dei dati - MVar CInt qui memorizza la quantità di Storable i vettori sono stati riempiti). Devo assicurarmi che i thread in C che scrivono su posizioni Storable siano bloccati mentre un thread Haskell sta leggendo i dati. È qui che aiuta la sincronizzazione MVar sul lato C. È anche molto più veloce chiamare Haskell (circa 15ns per non sicuro, ~ 150ns per sicurezza nel mio test) non sicura o addirittura sicura C di callback in Haskell da C (~ 5us). Se i callback fossero veloci, avrei richiamato la funzione C in Haskell e bloccato su Haskell MVar.
Aggiornamento:
algoritmo in pseudo-codice farà pure. Dovrebbe essere abbastanza facile implementarlo in C, dato l'algoritmo per newEmptyMVar, takeMVar e putMVar.
Per coloro che non hanno familiarità con 'MVar' di Haskell, vedere: [Control.Concurrent.MVar] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-MVar. html) –
Non posso aiutarti con la tua domanda, ma dove hai trovato il tempo per le chiamate all'estero tra Haskell e C. Ieri, ho vagato su come fare un benchmark usando questo criterio. – jmg
@jmg, codice qui (per haskell-> C): http://hpaste.org/56609. Nessun criterio di analisi comparativa, ma dovrebbe essere abbastanza semplice da fare e il risultato dovrebbe essere piuttosto vicino. Per il callback C-> Haskell, vedere il codice in questo post: http://stackoverflow.com/questions/8902568/runtime-performance-degradation-for-c-ffi-callback-when-pthreads-are-enabled – Sal