2016-08-16 7 views
-4

私は現在、C++のサイドプロジェクトとして単純な言語のコンパイラを実装しています。私はガベージコレクタを追加したいと思います。ほとんどの(すべて?)ガベージコレクションアルゴリズムは、ある時点で世界を停止させることを伴います。ガベージコレクタはどのようにすべてのスレッドを効率的に停止しますか?

私は親スレッドからスレッドのセットを一時的に一時停止する効率的な方法があるかどうかを知ることに興味があります。私が見る唯一の他のオプションは、GCがすべての関数とループの先頭で実行したいかどうかを定期的にチェックすることです。これは、毎回ロックしてロックを解除しなければならないため、かなりのオーバーヘッドが発生するため、非効率的なものとして私を襲ってしまいます。これを行うより効率的な方法はありますか?

+0

これまでのところ、背景コレクションは標準機能です。それはホイールなので、誰も正方形を好きではないので、誰も再発明しないでください。 –

+0

なぜガベージコレクションを使用するのですか?最後の参照がクリアされたときに解放される参照カウントされたオブジェクトで標準メモリ割り当てを使用すると、はるかに高速かつ効率的に動作します。例えば、 'std :: shared_ptr'を見てください。 –

+0

@Remy参照カウントは、想像できるGCの実現可能性が最悪です。あなたがサイクルのメモリリークを受け入れるならば、それがレイテンシで半良ければ唯一のことです。 – Voo

答えて

-1

まともな方法はありません.C++標準ライブラリが、VMを中断できる場所を魔法のように理解することは期待できません。その論理はあなたが書く必要があるものです。

ここで説明したようにルールを実装することもできますし、N命令を少なくしてリーフ関数の例外を作成し、M番目のループの繰り返しなどをチェックすることもできます。あなたがこれに注ぐことができる脳の量に制限はありません。

関連する問題