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);

我希望它能正常工作,但我认为我遇到的问题是使用互斥锁(Lock),我需要为我单独创建的每个对象都有一个互斥锁(Lock),以便我可以进行复制,并增加或减少计数,是原子的。如何实施?

请注意,它不完全是一个工作代码,它有点 sudo 代码。

感谢所有的帮助。

4

2 回答 2

3

锁会扼杀引用计数的性能。有关减少或消除所需锁数量的方法,请参见例如原子引用计数指针。

于 2013-04-18T00:43:42.040 回答
1

对于要保护的每个对象实例,您不一定需要一个单独的锁定对象。如果您对所有对象实例使用一个锁对象,这将保证一次只有一个线程可以操作引用计数。拥有多个锁对象只会减少线程阻塞的频率。

于 2013-04-18T00:03:19.263 回答