1

BYTE*、参照カウンター、およびCRITICAL_SECTION両方を同時アクセスから保護するを含むクラスがあります。

すべてを。に置き換えたいstd::tr1::shared_ptr<BYTE>です。MSDNによると:

オブジェクトが所有権を共有するコピーである場合でも、複数のスレッドが異なるshared_ptrオブジェクトを同時に読み取りおよび書き込みできます。

CRITICAL_SECTIONクラスのfromがクラスの外部で使用されて「ロック」され、相互に排他的な方法でコンテンツが変更されていることがわかるまで、すべて問題ないように聞こえます。さて、それはカプセル化を破ります、私はそれを変えたいです。

メモリが解放されることをshared_ptr保証しますが、メモリに書き込むときに相互排除を保証しますか?

4

1 に答える 1

5

ポイントが指すデータへの正しいアクセスを保証するのはあなた次第ですstd::tr1::shared_ptr。そのデータはあなたのものです。std::tr1::shared_ptrそれを削除するときだけが重要です。

オブジェクト自体に関してはstd::tr1::shared_ptr、次の保証があります。

  • 複数のスレッドから同じインスタンスから安全に読み取ることができます。
  • インスタンスがコピーである場合でも(同じ参照カウントなどを共有している場合でも)、複数のスレッドからの異なるインスタンスを安全に変更できます。shared_ptr

その他の同時アクセス(同じインスタンスへの同時読み取りと書き込みなど)は、未定義の動作です。

shared_ptrまた、新しいC ++ 11標準には、アトミックアクセス用の特別なAPIがあることに注意してください。

于 2011-08-24T20:54:39.057 に答える