OCamlの関数をCのスレッドで呼ぶ方法がわからない

Kinesisに慣れないために大分やきもきしているderuiです。未だに腕の置き方がピンときません。それとKinesisSKKだと何だか修行している気分になれます。気分だけ・・・。

そんな話は置いておいて、掲題の部分がよーわかりません。マニュアルに何か書いてあるかと期待しましたがこれまたよーわかりません。参考になりそうなのは↓のリンクなのですが・・・。
OCamlのマニュアル(英語)
ここに、マルチスレッドで動かす時の注意やらなんやらが書いてあります。

つまるところ、CからOCamlを呼べるのはつねに一つのスレッドからだけで、しかもそのスレッドがOCamlのrun-time systemが知っているものだけ、ということになるようです。OCaml側でThread.createした場合には自動的に登録されますが、C側で作ったスレッドは当然自分で登録してやる必要があります。
で、私が当初やりたかったのは、「C側で勝手に作られたスレッドからOCamlの関数を呼びたい」ということです。しかもここで言っているOCamlの関数はクロージャのことです。

以前、id:ocamlspotter さんからコメントを頂いた通り、closureを保存して他で利用するためには、caml_register_register_global_rootで登録するように言われています。また、他のスレッドで利用したかったので、グローバル変数として登録します。グローバルじゃなくても、ユーザデータとかで渡せばいいんですが。

で、ここで困ったのですが、前述の通り、CからOCamlの関数を呼ぶ、もしくは何らかの値に対して処理を施すことができるのは一度に一つのスレッドだけ、ということでした。OCamlは master lock という仕組みでここを制御しており、どこかでreleaseしてやらないと、スレッドの中でこのロックを待っていると、永遠に待つはめになります。というかなりました。マニュアルにはちゃんと書いてあったので、英語でもちゃんと読みましょう。
ところがこのスレッドは当然ながらどのタイミングで呼ばれるかわかりません。このスレッドはライブラリが勝手に作ったものなので、こっちがOCaml側のコードが動いている場合でも関係なく呼ばれます。となると、いつ master lock をreleaseするのか、という問題にぶちあたり、そこから進めなくなってしまいました。

まぁ具体的に言うと、SDL_Audioの実装をするときにこの問題にぶちあたりました。ちなみにcamlsdlのソースを見たら、そもそもSDL_Audioを実装していませんでした。なので実装していませんし、SDL_Mixerがあれば十分でしょう。
ただ、これは他のコールバックとかでも言えるような気がするので、この辺をいったいどうやっているのか、というのが結構気になりました。イベントループを回す前に release しておいて、イベントループの中ではOCamlのリソースを利用しないようにしているんでしょうか。それくらいしか思い浮かびません。

まぁ、ほとんどの場合は困ることはないんだと思いますが、ブラックボックスになっているライブラリがスレッドを作る場合にはどうしようもなさそうな気がします。どうにかする手段があっても、あまりやる気にはなれませんが・・・。