質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1216閲覧

"所有者なし" の Memory<T> インスタンスは非同期で使用する事はできないのか?

fijino

総合スコア136

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/10/27 00:09

編集2020/10/27 00:13

"所有者なし" の Memory<T> インスタンス

このような説明があります

譲渡を支援する IMemoryOwner<T> インスタンスはないため、所有権を他のコンポーネントに譲渡することはできません

他のコンポーネントに譲渡と言うのが何を指しているのか不明ですが、例えば以下のようにメンバー変数にいれて(Timerに譲渡して?)使う事はできないという事でしょうか?

C#

1 2 public class MemoryTest 3 { 4 Memory<char> _memory; 5 System.Threading.Timer _timer; 6 7 public MemoryTest() 8 { 9 this._memory = new char[256]; 10 this._timer = new System.Threading.Timer((o) => 11 { 12 var memory = this._memory; // ここでメモリーを使う事はできない? 13 // 確保したchar[256]がコンストラクタを抜けるとガベージ コレクターされる可能性があるから使えないという事でしょうか??? 14 }); 15 } 16 }

コメントに記載していますが、確保したchar[256]がコンストラクタを抜けるとガベージ コレクターされる可能性があるから使えないという事を言っているのでしょうか?

"所有者あり"のMemoryPool<char>.Shared.Rent()であれば使えないという事は理解できるのですが、
"所有権なし"の場合も使ってはいけないとい事でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

そういう話ではないです。
MemoryPool<T>.Rent()Memory<T> ではなく IMemoryOwner<T> を返すという点だけが重要で、Rent はメモリの管理責任をインターフェースの所有者へと移譲しているのです。
この「管理責任」を物体化して、他人に譲渡することで所有権の移動を表現可能にしたものが IMemoryOwner<T> です。
ここで Owner とは要するに、「メモリ領域を破棄する権利」を持つものと言い換えられます。すなわち、Owner の存在しない Memory<T> とは「破棄する権利を誰も持たないメモリ領域」と表現することができます。
Ownerless によって制約が存在するわけではなく、むしろ、破棄する管理責任から解放されたより自由なメモリ領域と言っても良いでしょう。
「所有者」を明確にする必要がそもそも無いから Ownerless なのです。

投稿2020/10/27 01:44

tamoto

総合スコア4252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fijino

2020/10/27 08:57

使っても問題ないという事ですね。 理解している通りであっていました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問