Есть ли известная реализация Haskell MVar
в C? Существует пример того, как реализовать это на C++. Но я хотел бы реализовать это на C - скажем, пока только MVar CInt
эквивалентно на C. Написание примитивов синхронизации может оказаться сложной задачей. Итак, я хотел бы избежать дублирования усилий, если кто-то уже сделал это. Я недостаточно хорошо понял приведенный выше пример на C++, чтобы уверенно перевести его на C — он очень хорошо скрывает алгоритмические детали от моего неискушенного в C++ ума :)
Причина, по которой я думаю о написании MVar на C, заключается в том, что мне очень легко использовать привязку FFI к внешней библиотеке C для получения потока данных и использовать потоки Haskell для захвата данных (из хранимых векторов, чтобы избежать маршалинг данных - MVar CInt здесь хранит, сколько векторов для хранения было заполнено). Мне нужно убедиться, что потоки C, записывающие в хранилища, заблокированы, пока поток Haskell читает данные. Вот где помогает синхронизация MVar на стороне C. Также гораздо быстрее вызвать небезопасную или даже безопасную функцию C из Haskell (~15 нс для небезопасной, ~150 нс для безопасной в моем тесте), чем обратный вызов в Haskell из C (~5 мкс). Если бы обратные вызовы были быстрыми, я бы вместо этого вызвал функцию C обратно в Haskell и заблокировал бы Haskell MVar.
Обновление:
Подойдет и алгоритм в псевдокоде. Это должно быть довольно легко реализовать на C, учитывая алгоритм для newEmptyMVar, takeMVar и putMVar.
MVar
, см.: Control.Concurrent.MVar - person Dan Burton   schedule 18.01.2012