共有所有権はほとんど意味がない
この答えはやや外れているかもしれませんが、所有権を共有することはユーザーエンドの観点から何の意味があるのでしょうか?少なくとも私が働いていたドメインでは、実際には何もありませんでしたシステムから削除されました。
多くの場合、別のスレッドのように、他の何かがまだリソースにアクセスしている間にリソースが破壊されないようにすることは、低レベルのエンジニアリングアイデアです。多くの場合、ユーザーがソフトウェアから何かを閉じる/削除する/削除するように要求するときは、できるだけ早く削除する必要があります(削除しても安全な場合はいつでも)。アプリケーションが実行されています。
例として、ビデオゲームのゲームアセットは、マテリアルライブラリのマテリアルを参照する場合があります。たとえば、あるスレッドでマテリアルがマテリアルライブラリから削除され、別のスレッドがまだゲームアセットによって参照されているマテリアルにアクセスしている場合、ぶら下がりポインタクラッシュは望ましくありません。しかし、それは、ゲームアセットが参照するマテリアルの所有権をマテリアルライブラリと共有することが意味をなさないということではありません。ユーザーにアセットと素材ライブラリの両方から素材を明示的に削除することを強制したくありません。他のスレッドがマテリアルへのアクセスを完了するまで、マテリアルの唯一の賢明な所有者であるマテリアルライブラリからマテリアルが削除されないようにするだけです。
リソースリーク
しかし、私はソフトウェアのすべてのコンポーネントにGCを採用していた元チームと協力しました。そして、他のスレッドがまだリソースにアクセスしている間にリソースが破壊されないようにするのに本当に役立ちましたが、代わりにリソースリークのシェアを取得することになりました。
また、これらは、1時間のセッション後に1キロバイトのメモリリークが発生するなど、開発者だけを混乱させるような些細なリソースリークではありませんでした。これらは重大なリークであり、多くの場合、アクティブなセッションでギガバイトのメモリが使用され、バグ報告につながりました。リソースの所有権が、たとえばシステムの8つの異なる部分の間で参照されている(したがって所有権で共有されている)場合、ユーザーがリソースの削除を要求したことに応答して、リソースの削除に失敗するのは1つだけです漏れ、場合によっては無期限に。
だから、漏れやすいソフトウェアを簡単に作成できるため、GCやリファレンスカウントの大規模なファンではありませんでした。以前はぶら下がりポインタクラッシュでしたが、これは検出が容易で、非常に検出しにくいリソースリークに変わり、テストのレーダーの下で簡単に飛ぶことができます。
言語/ライブラリがこれらを提供する場合、弱参照はこの問題を軽減できますが、混合スキルセットの開発者チームが適切な場合に常に弱参照を一貫して使用できるようにすることは困難であることがわかりました。そして、この難しさは社内チームだけでなく、ソフトウェアのすべてのプラグイン開発者に関係していました。それらもまた、犯人としてプラグインにさかのぼることを困難にする方法でオブジェクトへの永続的な参照を保存するだけで、システムにリソースを簡単にリークさせる可能性があります。ソースコードが制御外にあるプラグインが、これらの高価なリソースへの参照をリリースできなかったためにリークされただけです。
解決策:遅延、定期的な削除
そのため、後に両方の世界で見つけた最高の結果をもたらした個人プロジェクトに後で適用した私のソリューションreferencing=ownership
は、リソースの破壊を延期している概念を排除することでした。
その結果、ユーザーがリソースの削除を必要とする何かをするたびに、APIはリソースを削除するだけで表現されます。
ecs->remove(component);
...ユーザーエンドのロジックを非常に簡単な方法でモデル化します。ただし、同じコンポーネントに同時にアクセスできる処理段階に他のシステムスレッドがある場合、リソース(コンポーネント)はすぐには削除されない可能性があります。
したがって、これらの処理スレッドは、ガベージコレクターに似たスレッドが起動して「世界を停止」し、終了するまでそれらのコンポーネントの処理からスレッドをロックアウトしながら、削除が要求されたすべてのリソースを破棄できるようにする時間をあちこちで生成します。ここで行う必要のある作業の量が一般的に最小限に抑えられ、フレームレートが著しく低下しないように、これを調整しました。
今では、これが試行錯誤され、十分に文書化された方法であるとは言えませんが、これは数年前から使用しており、頭痛もリソースリークもありません。アーキテクチャがこの種の同時実行モデルに適合できる場合は、GCやref-countingよりもはるかに手が軽く、テストのレーダーの下を飛んでいるこれらのタイプのリソースリークのリスクがないため、このようなアプローチを検討することをお勧めします。
ref-countingまたはGCが役立つとわかった場所の1つは、永続的なデータ構造です。その場合、それはデータ構造の領域であり、ユーザー側の懸念とは大きく異なり、実際には、各不変のコピーが同じ変更されていないデータの所有権を共有している可能性があります。