web-dev-qa-db-ja.com

一意性タイプを使用して安全な並列処理を実装する

私はしばらくの間、純粋な関数型言語のモナドの代わりとして一意性型に興味を持っていました。残念ながら、これはCS研究の難解な分野の一種であり、一意性タイプを使用したプログラミングに関するオンラインリソースはほとんどありません。

一意性タイプを使用して参照(「ボックス」)や配列などのステートフルデータ構造を実装する方法は明らかですが、他の一般的なステートフルデータ構造を実装する方法はわかりません。

たとえば、一意の型でロックを実装することは可能ですか?一意性タイプを使用して、スレッド間で可変デー​​タを共有できますか?一意のタイプを使用して同期プリミティブ(ミューテックスなど)を構築することは可能ですか、それともメッセージパッシングが必要ですか?

19
Ricky Stewart

たとえば、一意のタイプでロックを実装することは可能ですか?

私はロバート・ハーヴェイが提供したリンクをたどり、簡単に読みました。私はすべてを理解したとは言えませんし、私が本当に私が理解したことを本当に理解したと確信しているとは言えませんが、外部の一意性と参照の不変性は、ロックの必要がないことです。

マルチスレッドに対する最新のアプローチでは、ロックを回避しようとします。ロックを使用するコードを記述できるのは、熟練したプログラマーだけであり、そのコードでさえバグが発生しやすいためです。ロックコードが事実上テスト不可能であるという事実に加えて、それが非常に望ましくない方法であることは明らかであり、ロックから解放することを目的とするソリューションは控えめに言っても約束です。

私たちがロックを回避している方法は、メッセージを渡すことです。これには、メッセージが不変である必要があります。概して、(一見すると)参照の不変性は、実際に不変の型を構築する必要なしに不変性を保証するのに役立つ手法のようであり、外部の一意性は、厳密な不変性の要件をローカルで緩和するのに役立つ手法のようです。

一意性タイプを使用して、スレッド間で可変デー​​タを共有できますか?

紙はそれを明確に述べていませんでしたが、私が理解していることから、オブジェクトの外部的に一意のクラスターはスレッドセーフです(何とかして(実際にはhow?)そこに外部参照が1つだけ存在することが保証されているため)つまり、そのような参照を受け取ったスレッドは、他のスレッドが別の参照を持っている可能性がないため、他のスレッドがオブジェクトを変更することを心配する必要なく、参照されたオブジェクトを変更可能として扱うことができます。このような理論的構成をどのように実装および実施できるかを知りたいと思います。

一意の型を使用して同期プリミティブ(ミューテックスなど)を構築することは可能ですか、それともメッセージの受け渡しが必要ですか?

繰り返しますが、私が理解していることから、外部的に一意の型と参照の不変性は、ロック、ミューテックスなどを不要にすることを目的としています。メッセージパッシングは進むべき道であるように見え、それは良いことです。

2
Mike Nakis