私は、C言語のライブラリにFFIモジュールを作成しています。これは、1回限りの非リエントラント関数を呼び出す前に呼び出されます。この呼び出しは等式ですが、ステートフルなので、すべてのHaskell呼び出しで呼び出すことができます。しかし、それは遅いですし、非リエントラントのために、それは衝突を引き起こす可能性があります。unsafePerformIOとFFIライブラリの初期化
これで、unsafePerformIOを使用するのは適切なタイミングですか?安全でないIORefまたはMVarにBoolをラップして、後続の呼び出し(グローバルで隠されたIORef状態がFalseの呼び出し)を無視して、これらの初期化呼び出しを冪等価にすることができます。
そうでない場合、これを行う正しい方法は何ですか?
1つの選択肢は、メインの周り 'withX'ラッパーです。これは静的な保護者を与えません、私はちょうどそこに優先順位(ネットワークパッケージからの 'withSocketsDo')があると言っています。 –
ああ、良い点。 'withToken $ \ t - >'より簡単ですが、保証はありません。 –
ああ、優秀!これははるかに良い解決策です。私は、グローバルステートがマルチスレッドとどのように相互作用するか心配していました(unsafeされたMVarスレッドローカル、ランタイムローカルですか?)。これはまた、暗黙的で隠れているのではなく、Haskellランタイムで初期化の失敗をローカライズ可能にします。 –