面试题: C++怎么实现热更新内存数据?

2022-03-31 20:40:38 +08:00
 java253738191

c++服务端初始化阶段会将某二进制文件load 到内存中,每次请求都会访问该内存数据,c++服务端有持续请求,现在该二进制文件更新了,如何将该二进制文件热更新到内存中且不影响线上请求?内存空间足够

3817 次点击
所在节点    程序员
31 条回复
encro
2022-04-01 09:32:06 +08:00
其实最安全可靠的是提供接口,让别人调用,而不是拿文件做交互,
既然是文件交互,那么不可避免的存在实时性问题。
如果不关心实时性问题,那么就如一楼所说,是一个内存指针 swap 的问题了。
anonymousar
2022-04-01 10:22:02 +08:00
2 个 shared ptr swap 。 其实就是 double buffer
zhangchongjie
2022-04-01 10:24:53 +08:00
@iceheart 🤫别说出来
jones2000
2022-04-01 10:29:05 +08:00
2 个内存块,奇偶切换
java253738191
2022-04-01 10:52:59 +08:00
@iceheart @zhangchongjie 你们这格局太小了,动不动说要方案,这种实现方法千千万又不是什么难题
boaofCHIAN
2022-04-01 10:53:30 +08:00
内存够的话 double buffer 双内存块奇偶切换 切换的指针用 atmoi 保护起来
undef404
2022-04-01 11:02:45 +08:00
是给服务端程序添加一段热更新的代码? 还是用另外的程序热更新服务端的内存数据?
java253738191
2022-04-01 11:27:41 +08:00
@boaofCHIAN 切换都简单,不考虑性能下 std::atomic<SharedPtr>或者 AtomicSharedPtr 都可以做,关键要考虑 old 的释放时机,old 内存可能请求正在调用
java253738191
2022-04-01 11:31:45 +08:00
@LifStge 面试题上面还有一题忘记说了,redis 的渐进式 rehash 如何实现的,其中有个 ht[2]如何切换的,衍生出该题
ipwx
2022-04-01 11:39:06 +08:00
@exch4nge atomic_load 要自己维护引用计数。

不过你说得对,多线程写同一个 shared_ptr 并不安全。但是多线程读是安全的,因此我们可以这样:

std::shared_ptr<...> yourData;
std::mutex yourDataLock;


// 载入数据的函数
void loadData() {
// 载入
std::shared_ptr<...> newData;
// 更新
{
std::unique_lock<...> lockGuard(yourDataLock);
yourData = newData;
}
}

// 使用数据的函数
void useData() {
std::shared_ptr<...> theData = yourData;
// 使用 yourData
}
ipwx
2022-04-01 11:42:02 +08:00
@exch4nge 好吧你说的是 atomic_store(&yourData, make_shared<myClass>());

你是对的。我的 lock 做法过了(滑稽)。这可真是个好东西

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844178

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX