[過去ログ] マルチスレッドプログラミング相談室 (986レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
942
(4): 767=793=902=918=921 02/11/17 02:31 AAS
>>941
参照を得る/切るタイミングでアトミックにカウントが上がる/下がる必要が
あるからなぁ。
そうでないと、無効なオブジェクトを参照してしまう。

ならば、参照カウントが 0 でも有効な(というより、無効かどうか判別できる)
ものを作るのも一つの手だな。

bool Object::ref(){
 bool valid = false;
 cs_.enter();
 if(refCount_ > 0){
  refCount_++;
  valid = true;
 }
 cs_.leave();
 return result;
}

void Object::release(){
 cs_.enter();
 if(refCount_ > 0){
  refCount_--;
  if(refCount_ == 0){
   garbages__.add(this);
  }
 }
 cs_leave();
}

で、安全なタイミングで(ってそれが一番むずい気も)garbages__(グローバル変数)
の要素を delete してやると。
943
(1): 942 02/11/17 02:32 AAS
# 続き。改行が多すぎるって言われちまった。

あるいは、Object ではなく、SharedPtr みたいな入れ物でこれをやっても良い。
SharedPtr のフィールドは Object* を格納する ptr_ と refCount_。refCount_ が
0 になったときに delete ptr_ するけど、 SharedPtr 自体は無効な状態で
残り、garbages__ に入る。

コメントくれ 736。もしくは偉い人。
944: 942 02/11/17 02:40 AAS
>>942
ああ。result 返してるよ。ref の最後は return valid; ね。
コンパイルくらいは通すか...
952
(1): 942 02/11/17 22:45 AAS
>>946
いやだから。
List で排他制御をかけずに安全な方法があるかを探してる。

ってあまりやると今度は俺が煽られるかな。
954: 942 02/11/18 01:19 AAS
>>953
その特殊な場合が知りたい。
そのために、902 の List::remove では、items_[index] = NULL をもって
要素削除としてる。

いや、現実問題、こんなことしてたら、List も Object も、使う側に
知識を要求する、やっかいなクラスになるとは思う。

ただ、そうすることによってパフォーマンスが得られるなら、
それが有効な選択肢になる場合もある。
ってことで、無理問答みたいなことを続けてるわけだ。

っていうか 736 が続けてくれよこれ。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.027s