2013-04-17 24 views
1

我想在多线程程序中实现对象的引用计数,以便我可以删除该对象,当任何线程都不想使用它或某个人启动该对象时删除。多线程应用程序中的对象的引用计数C++

因为我正在做以下事情。

class refCount{ 
     int ref_count; 

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

我希望它会正常工作,但我认为这个问题我甲肝使用mutexs(锁定),我需要有一个互斥体(锁)为我创建的每个对象单独创建,以便我可以使这种应对和计数的增加或减少可以是原子的。如何实现这一点。

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

感谢您的帮助。

+2

boost和C++ 11都有一个可以使用的引用计数对象。 –

+1

互斥体是非常昂贵和重量级的。对于参考计数,你应该看看原子。 –

回答

1

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

+0

亚当你说它会工作,但因为每个thraed将访问这些对象的多个具有一个锁将阻止其他线程,即使其他线程不访问同一个对象。所以y想锁定我创建的每个对象。 – bana