Redian新闻
>
栀子花叶背面长白毛和白虫
avatar
栀子花叶背面长白毛和白虫# gardening - 拈花惹草
w*x
1
template
class SmartPointer
{
public:
SmartPointer(const SmartPointer& p) { addRef(p); }
SmartPointer(T* p) { assign(p); }
~SmartPointer() { decRef(); }
public:
SmartPointer& operator = (const SmartPointer& p)
{
if (this != &p)
{
decRef();
addRef(p);
}
return *this;
}
T* operator ->() const { return m_pVal; }
T& operator *() const { return *m_pVal; }
private:
void decRef()
{
(*m_pRef)--;
if (0 == *m_pRef)
delete m_pVal;
}
void addRef(const SmartPointer& ptr)
{
m_pRef = ptr.m_pRef;
m_pVal = ptr.m_pVal;
(*m_pRef)++; // not *m_pRef++ !!
}
void assign(T* p)
{
m_pVal = p;
m_pRef = new int(1);
}
private:
T* m_pVal;
int* m_pRef;
};
不会做啊,好象很难的样子。特别是如果析构和operator =同时在不同的线程里调用
avatar
l*6
2
小白虫会飞,长在白毛里,怎么除?用什么药?
avatar
g*e
3
OP你是女的吗?
avatar
m*a
4
我家去年就长过,很多很多。只好等花开完后把大的树枝及其树叶全剪掉,只剩光秃秃
的主干。然后用大水冲洗,十来分钟后,会发现很多小白虫飞了,或冲下来了。就这样
没管它,一冬天后,今年又绿油油的,开了很多花,也没小白虫。
avatar
w*x
5

很重要吗?

【在 g*********e 的大作中提到】
: OP你是女的吗?
avatar
l*6
6
总该有什么药除掉吧?
avatar
i*e
7
我认为可以用mutex或semaphore把reference counter保护起来。
private:
T* m_pVal;
int* m_pRef;
static pthread_mutext_t mutex = PTHREAD_MUTEX_INITIALIZER;
每次试图访问m_pRef时先要acquire mutex, 访问结束release.
void addRef(const SmartPointer& ptr)
{
pthread_mutex_lock(&mutex);
m_pRef = ptr.m_pRef;
m_pVal = ptr.m_pVal;
(*m_pRef)++; // not *m_pRef++ !!
pthread_mutex_unlock(&mutex);
}
mutex是互斥锁,如果你想允许多线程同时读,还可以用readwrite_lock.
avatar
w*x
8

mutex是哪来的?? 什么时候销毁??
如果mutex是多个smart pointer共享的, 那么一个在调用operator =的时候中断, 执行
另一个线程的析构函数,如果这时counter是0, 销毁指针也同时销毁mutex, 那么继续执
行operator =的时候mutex就会是无效的.

【在 i******e 的大作中提到】
: 我认为可以用mutex或semaphore把reference counter保护起来。
: private:
: T* m_pVal;
: int* m_pRef;
: static pthread_mutext_t mutex = PTHREAD_MUTEX_INITIALIZER;
: 每次试图访问m_pRef时先要acquire mutex, 访问结束release.
: void addRef(const SmartPointer& ptr)
: {
: pthread_mutex_lock(&mutex);
: m_pRef = ptr.m_pRef;

avatar
i*e
9
这里的mutex是static类型的,你不用在dtor中销毁,当整个程序结束操作系统会clean
up static memory的。
static 类成员是由SmartPointer类对象所有实例所共享的,它只有一个copy, 所以不
论哪个实例的assignment operator 或 copy ctor 被调用, 只能等mutex。它的作用
就是保护reference counter在多线程异步访问时避免出现data inconsistency。
avatar
w*x
10

clean
所有的smart pointer公用一个static的mutex会不会效率太低了? 不过好像也找不到更
好的解决办法了...

【在 i******e 的大作中提到】
: 这里的mutex是static类型的,你不用在dtor中销毁,当整个程序结束操作系统会clean
: up static memory的。
: static 类成员是由SmartPointer类对象所有实例所共享的,它只有一个copy, 所以不
: 论哪个实例的assignment operator 或 copy ctor 被调用, 只能等mutex。它的作用
: 就是保护reference counter在多线程异步访问时避免出现data inconsistency。

avatar
a*n
11
显然用STATIC 变量是错误的,,大致说下啊,
在这里,,一个class的实例里面有2个PRIVATE的变量,,那么THREAD-SAFE的功能就是
保护这2个变量。。。在构造函数里面直接初始化MUTEX,,然后在惜购里面删除MUTEX,每
次访问这2个私有变量的时候,,要用MUTEX来保护,,防止不同线程同时访问/改变这2
个私有变量。。。
用STATIC的MUTEX不是不可以,,但是效率低,,意味着一个SMART POINTER CLASS的不
同实例也不能同时访问/修改。。。
avatar
w*x
12

这2
这个问题怎么解决:
如果mutex是多个smart pointer共享的, 那么一个在调用operator =的时候中断, 执行
另一个线程的析构函数,如果这时counter是0, 销毁指针也同时销毁mutex, 那么继续执
行operator =的时候mutex就会是无效的.

【在 a*****n 的大作中提到】
: 显然用STATIC 变量是错误的,,大致说下啊,
: 在这里,,一个class的实例里面有2个PRIVATE的变量,,那么THREAD-SAFE的功能就是
: 保护这2个变量。。。在构造函数里面直接初始化MUTEX,,然后在惜购里面删除MUTEX,每
: 次访问这2个私有变量的时候,,要用MUTEX来保护,,防止不同线程同时访问/改变这2
: 个私有变量。。。
: 用STATIC的MUTEX不是不可以,,但是效率低,,意味着一个SMART POINTER CLASS的不
: 同实例也不能同时访问/修改。。。

avatar
n*t
13
什么公司要你做这种东西?纯粹是二杆子公司啊。。

【在 w****x 的大作中提到】
:
: 这2
: 这个问题怎么解决:
: 如果mutex是多个smart pointer共享的, 那么一个在调用operator =的时候中断, 执行
: 另一个线程的析构函数,如果这时counter是0, 销毁指针也同时销毁mutex, 那么继续执
: 行operator =的时候mutex就会是无效的.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。