我的应用程序有一个 IRC 模块,它本质上是一个普通的客户端。由于这是大量线程,我承担插件检索例如用户昵称的风险 - 它当时有效,但解析器触发更新,更改所述昵称。一旦另一个线程再次执行,它就会处理指向现在无效内存的指针,因为不可能将返回 + 复制作为原子操作。
根据下面的代码,我对此的假设是否正确?因此,我想我必须使用通常的互斥锁/解锁方法,除非有人可以确认或提出其他建议(我宁愿不必转换并返回 shared_ptr,但我想这是一个有效的选项,它是只是我打算 SWIG'ing 这个,不知道它是否不喜欢它们)。
IrcUser.h
class IrcUser : public IrcSubject
{
private:
...
std::shared_ptr<std::string> _nickname;
std::shared_ptr<std::string> _ident;
std::shared_ptr<std::string> _hostmask;
public:
...
const c8*
Ident() const
{ return _ident.get()->c_str(); }
const c8*
Hostmask() const
{ return _hostmask.get()->c_str(); }
const u16
Modes() const
{ return _modes; }
const c8*
Nickname() const
{ return _nickname.get()->c_str(); }
bool
Update(
const c8 *new_nickname,
const c8 *new_ident,
const c8 *new_hostmask,
const mode_update *new_modes
);
};
IrcUser.cc
bool
IrcUser::Update(
const c8 *new_nickname,
const c8 *new_ident,
const c8 *new_hostmask,
const mode_update *new_modes
)
{
if ( new_nickname != nullptr )
{
if ( _nickname == nullptr )
{
*_nickname = std::string(new_nickname);
}
else
{
_nickname.reset();
*_nickname = std::string(new_nickname);
}
Notify(SN_NicknameChange, new_nickname);
}
...
}