【发布时间】:2017-09-14 11:49:39
【问题描述】:
我们正在使用 boost::serialization 将带有 std::vector 的类序列化和反序列化为普通文件。在将条目添加到向量中之前,反序列化过程会创建一个新的类实例。 由于我们处于多线程应用程序中,因此我们希望确保在反序列化过程中正确锁定关键部分。
template<class obj>
inline void MetaSerialize(std::string strKey, obj *ptr)
{
LOCK(ptr->csAccess);
std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
boost::archive::binary_oarchive oa(stream);
oa << ptr;
if (!m_pMetaDB->Put(rocksdb::WriteOptions(), strKey, rocksdb::Slice(stream.str().data(), stream.tellp())).ok())
LOG_ERROR("Unable to serialize " + strKey, "SM");
};
template<class obj>
void MetaDeserialize(std::string strKey, obj *ptr)
{
if (*ptr)
{
delete *ptr;
*ptr = NULL;
}
std::string strTmp;
if (m_pMetaDB->Get(rocksdb::ReadOptions(), strKey, &strTmp).ok())
{
std::stringstream stream(strTmp);
boost::archive::binary_iarchive ia(stream);
ia >> *ptr;
}
};
我的想法是在反序列化过程中使用前置和后置函数来锁定或解锁关键部分。
遗憾的是,我没有在文档中找到那些钩子或函数。是否有任何我没有找到的功能,或者是否有其他功能可用于通过反序列化过程建立安全锁定?
提前致谢
【问题讨论】:
-
序列化对并发一无所知。您需要手动保护整个反序列化(和序列化)
-
这正是我想要做的。这就是为什么我要询问 pre 和 post 函数/钩子。
-
没有钩子。
-
为什么不使用标准的锁具?为什么不使用(异常安全的)智能指针?为什么不使用交换习语。另外,我认为您在不进行序列化的情况下删除指针时遇到严重问题(析构函数执行该锁定实际上没有意义,因为它只能锁定成员同步原语。任何其他代码在等待锁定时阻塞运行的析构函数将在陈旧的对象上被阻止。-UB)
-
你似乎有 LOCK ...这不是一个“钩子”吗?你考虑过 std::mutex 吗? (作为“钩子”?)我通常更喜欢 Posix Process Semaphore,设置为本地模式(未命名,未共享),这似乎运行良好(有效)。我不知道你所说的“钩子或函数”是什么意思。也许你可以用更多关于你正在寻找的“钩子或函数”的信息来更新你的问题。
标签: c++ serialization boost