1

マルチスレッド プログラムでオブジェクトの参照カウントを実装しようとしています。これにより、どのスレッドもオブジェクトを使用したくない場合、または誰かがオブジェクトの削除を開始した場合にオブジェクトを削除できます。

そのために、次のことを行っています。

class refCount{
    int ref_count;

    public:
        void incr_ref_count(){
        ref_count ++;
    } 

    int decr_ref_count(){
        ref_count--;
        return ref_count; 
    }

}

そして、異なるスレッドで obj をコピーするたびに、次のコードを使用しています。

pthread_mutex_lock(&ref_count_lock);
if(obj != NULL){
    dup_obj = obj;
    obj.incr_ref_count(); 
}
pthread_mutex_unlock(&ref_count_lock); 

そして参照を削除しながら

pthread_mutex_lock(&ref_count_lock);
if(dup_obj != NULL){
    count = dup_obj.decr_ref_count(); 
    if(count == 0)
        delete dup_obj
}   
pthread_mutex_unlock(&ref_count_lock);

私はそれがうまくいくことを望んでいましたが、私が抱えている問題はミューテックス(ロック)の使用にあると思います。コピーを作成したり、増やしたりできるように、個別に作成するオブジェクトごとにミューテックス(ロック)が必要です。アトミックになるようにカウントを減らします。これを実装する方法は?

正確には動作するコードではなく、sudo コードのようなものであることに注意してください。

すべての助けに感謝します。

4

2 に答える 2

1

保護するすべてのオブジェクト インスタンスに対して個別のロック オブジェクトが必ずしも必要というわけではありません。すべてのオブジェクト インスタンスに対して 1 つのロック オブジェクトを使用すると、一度に 1 つのスレッドだけが参照カウントを操作できることが保証されます。複数のロック オブジェクトを使用しても、スレッド ブロックの頻度が減るだけです。

于 2013-04-18T00:03:19.263 に答える