ロックフリーのデータ構造を開発すると、次の問題が発生します。
ヒープ上にオブジェクトを作成し、それらを参照カウンター付きのスマート ポインターにラップするライター スレッドがあります。また、これらのオブジェクトを操作するリーダー スレッドも多数あります。コードは次のようになります。
SmartPtr ptr;
class Reader : public Thread {
virtual void Run {
for (;;) {
SmartPtr local(ptr);
// do smth
}
}
};
class Writer : public Thread {
virtual void Run {
for (;;) {
SmartPtr newPtr(new Object);
ptr = newPtr;
}
}
};
int main() {
Pool* pool = SystemThreadPool();
pool->Run(new Reader());
pool->Run(new Writer());
for (;;) // wait for crash :(
}
スレッドローカルコピーを作成ptr
すると、少なくとも
- アドレスを読み取ります。
- 参照カウンターをインクリメントします。
これら 2 つの操作をアトミックに実行できないため、リーダーが削除されたオブジェクトを操作することがあります。
問題は、正しいメモリ管理を可能にして複数のスレッドから読み取り/書き込みアクセスを可能にするために、どのような種類のスマート ポインターを使用する必要があるかということです。Java プログラマーはそのような問題を気にすることさえなく、すべてのオブジェクトが参照であり、誰もそれらを使用しない場合にのみ削除されることに単純に依存しているため、解決策が存在するはずです。
PowerPC についてはhttp://drdobbs.com/184401888を見つけました。見栄えは良いのですが、x86 にはない Load-Linked 命令と Store-Conditional 命令を使用しています。
私が理解している限り、ブースト ポインターは、ロックを使用してのみそのような機能を提供します。ロックフリーのソリューションが必要です。