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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
955
(2): 02/11/18 10:58 AAS
あのさぁ、参照カウントの時に出てきた↓を見てみたんだけど、
外部リンク[htm]:www.gotw.ca

void String::AboutToModify(size_t n, bool bMarkUnshareable /* = false */)
 int refs = IntAtomicGet( data_->refs );
 if( refs > 1 && refs != Unshareable ) {
  StringBuf* newdata = new StringBuf( *data_, n );
  if( IntAtomicDecrement( data_->refs ) < 1 ) {
   delete newdata; // just in case two threads
  } // are trying this at once
  else { // now all the real work is
   data_ = newdata; // done, so take ownership
  }
 } else {
  data_->Reserve( n );
 }
 data_->refs = bMarkUnshareable ? Unshareable : 1;
}

の、delete newdataって間違いじゃない?
956: 955 02/11/18 11:25 AAS
複数のスレッド(それぞれが参照を持つ)が同時にAboutToModifyを呼び出すと、
それぞれが共有を解除して、独自にデータを持つわけだが、その内の一つは
data_->refs が0になるから、元の共有していたdata_の指す先か、newdataの
一方を開放する必要がある。

というのは判るんだけど、AbountToModifyは共有解除と共にsize_t nに
データ領域のサイズを拡張しなきゃならんのに、delete newdataでは
data_の指す先の領域のサイズはsize_t nだけあるとは限らなくない?

ここは、単純に
if( IntAtomicDecrement( data_->refs ) < 1 ) {
 delete data_; // just in case two threads
}
data_ = newdata; // done, so take ownership
じゃないかと思うんだが…
958
(1): 955 02/11/18 16:22 AAS
ですな。
でも、既にnewdataはサイズn以上で領域確保しているので、
data_を破棄する方が良いかと。

誰も、反論が無いところを見ると、やっぱり間違いと言う事でよろしいか?
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.035s