どのように実行スレッドの安全なリファレンスカウンターで、C++
-
01-07-2019 - |
質問
どうでしょ実施 効率的かつスレッドの安全なリファレンスカウンターシステム X86Cpu、C++のプログラミング言語?
いつもの問題を 重要業務は原子, のご利用X86インターロック操作には十分な実施のための参考計数システム。
以下の記事のカバーはこの課題でしたが、特CPUの指示:
解決
現在では使用でき、ブTR1shared_ptr<>スマートポインタを保持参照対象の参照です。
作;な騒ぎになmuss.のshared_ptr<>クラスのすべてのロックのrefcount.
他のヒント
VC++を使用でき _InterlockedCompareExchange.
do
read the count
perform mathematical operation
interlockedcompareexchange( destination, updated count, old count)
until the interlockedcompareexchange returns the success code.
他のプラットフォーム/コンパイラの使用に適切に固有のロックCMPXCHG指導を行うことでMSの_InterlockedCompareExchange公開.
厳密に言うときまで待C++0xに書き込めるレコードを純粋なC++.
今は使用できPosixは、独自に作成プラットフォーム非依存のラッパーの周りを比較し、スワップおよび/または連動の増分/減分).
Win32InterlockedIncrementAcquireとInterlockedDecrementRelease(たい場合には安全ですが、気にプラットフォームで並べ替えが必要な課題の記憶障害、同時又はInterlockedIncrementとInterlockedDecrement(していまx86)まで、原子といる。
とはいえ、ブTR1shared_ptr<>取り扱います、そのためない限り、必要なプロジェクトを実施するお客様ご自身で、おそらく続的なこだわります。
このロックは非常に高価であるのですが毎回手にメジャーでの間にスマートポインタがあっても、オブジェクトが現在保有するスレッドのスマートポインター図書館は知らないます。
このことから、あの経験則の適用はこちら嬉しいレコードを修正してくださ!)
場合にも適用します:
- て複雑なデータ構造とは難しいのではないでしょうかを書destructorsめた場合には、STL-スタイル値が意味を適当でないと、デザイン)りにご利用いただけますスマートポインタです
- ご利用は、複数のスレッドで共有するこれらのオブジェクト、
- お気にして正
...そして実際にごみ収集するもの。はGCが悪い評判のファイアーパフォーマンスの経験ではすべて相対的です。と思いますを比較し非常に好意的ロックのスマートポインタ.での重要な部分のCLRチームを選んだの真GCの代わりに何かをリファレンスカウンター.見 この記事, 特にこのスタークとの比較の基準割合で計測く
なref-計数:
a = b;
参考計数:
if (a != null)
if (InterlockedDecrement(ref a.m_ref) == 0)
a.FinalRelease();
if (b != null)
InterlockedIncrement(ref b.m_ref);
a = b;
の場合は指導そのものが原子力する必要があり、部コードをもとに更新する、適切な変重要です。
すなわち 必要なものを防止その他のスレッドの侵入があった場合には部のコードを使用しロックスキームです。もちろん、ロックが必要な原子ができるスペ原子ロック機構内のpthread_mutexクラスです。
の問題の効率的な:は、pthread図書館とシステムでも保証するミューテックスのロックは原子ごOS.
で高価:たぶん。ももれることによって行われる保証があります。
そのコードに掲示するddjは追加の複雑さを考慮バグ用のスマートポインタ.
具体的には、できない場合は保証のスマートポインタな変化の指定もスマートポインタ位置を確認することができまでとなっていてとても信頼できない。場合にスマートポインタが変更されながら、他のスマートポインタで、このコードを譲渡しない独自のスマートポインタを疑う。