最近では、ロックを使用せず、Erlang のようなメッセージ パッシング アプローチを使用することが話題になっています。または、関数型プログラミングと C++/Java のような不変データ構造の使用について。
ただ、気になるのは以下の点です。
- 私の知る限り、Erlang はメッセージの配信を保証しません。メッセージが失われる可能性があります。メッセージの損失を心配する必要がある場合、アルゴリズムとコードが肥大化し、再び複雑になることはありませんか? 使用する分散アルゴリズムは、メッセージの配信保証に依存してはなりません。
- Message が複雑なオブジェクトの場合はどうなるでしょうか? メッセージをコピーして送信する場合と、メッセージを共有の場所 (両方のプロセスがアクセスできる DB など) に保持する場合とでは、パフォーマンスが大幅に低下しませんか?
- 共有状態を本当に完全になくすことができますか? 私はそうは思わない。たとえば、DB では、同じレコードにアクセスして変更する必要があります。そこではメッセージパッシングを使用できません。ロックするか、Optimistic 同時実行制御メカニズムを想定してから、エラーのロールバックを行う必要があります。Mnesia はどのように機能しますか?
- また、常に並行性について心配する必要があるわけではありません。どのプロジェクトにも、同時実行性やトランザクションをまったく処理する必要のない大きなコードが含まれます (ただし、パフォーマンスと速度が懸念されます)。これらのアルゴリズムの多くは、共有状態に依存しています (そのため、参照渡しまたはポインターが非常に便利です)。
この事実を考えると、Erlang などでプログラムを作成することは、これらのことを行うことができないため苦痛です。おそらく、それはプログラムを堅牢にしますが、線形計画問題の解決や凸包の計算などの場合、パフォーマンスがより重要であり、並行性/トランザクションとは関係がない場合にアルゴリズムに不変性などを強制することは悪い決定です. ではない?