¿Hay alguna implementación conocida de Haskell MVar
en C? Hay un example sobre cómo implementarlo en C++. Pero me gustaría implementarlo en C, digamos solo MVar CInt
equivalente en C por ahora. Escribir primitivas de sincronización puede ser complicado. Por lo tanto, me gustaría evitar la duplicación de esfuerzos si alguien ya lo ha hecho. No entendí el ejemplo de C++ más arriba lo suficiente como para traducirlo con confianza en C - esconde muy bien los detalles algorítmicos de mi C++ - mente inexperta :)Implementación de MVar en C?
La razón por la que estoy pensando en escribir MVar en C es porque hace que sea muy fácil para mí usar el enlace FFI a una biblioteca C externa para obtener la secuencia de datos, y usar hilos Haskell para tomar los datos (de vectores almacenables para evitar ordenar los datos - MVar CInt aquí almacena cuánto de los Almacenables vectores se han llenado). Necesito asegurarme de que los hilos C que escriben en ubicaciones Almacenables estén bloqueados mientras un hilo Haskell está leyendo los datos. Ahí es donde la sincronización de MVar en el lado C ayuda. También es mucho más rápido llamar a la función C insegura o incluso segura de Haskell (~ 15ns por inseguro, ~ 150ns por seguro en mi prueba), que volver a llamar a Haskell desde C (~ 5us). Si las devoluciones de llamada fueran rápidas, habría hecho que la función C llamara de nuevo a Haskell y bloqueara Haskell MVar.
Actualización:
algoritmo en pseudocódigo hará también. Debería ser bastante fácil implementarlo en C, dado el algoritmo para newEmptyMVar, takeMVar y putMVar.
Para quienes no estén familiarizados con 'MVar' de Haskell, ver: [Control.Concurrent.MVar] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-MVar. html) –
No puedo ayudarte con tu pregunta, pero ¿de dónde sacaste el tiempo para llamadas extranjeras entre Haskell y C. Ayer, he estado vagando cómo comparar ese criterio de uso. – jmg
@jmg, código aquí (para haskell-> C): http://hpaste.org/56609. No hay criterios de referencia allí, pero debería ser bastante simple de hacer, y el resultado debería ser bastante cercano. Para la devolución de llamada C-> Haskell, consulte el código en esta publicación: http://stackoverflow.com/questions/8902568/runtime-performance-degradation-for-c-ffi-callback-when-pthreads-are-enabled – Sal