以前一直都是做同步方式的数据结构存储。即典型的:
void TMyClass::onSave(TStorage & s)
{
s << member1;
s << member2;
......
}
void TMyClass::onLoad(TStorage & s)
{
s >> member1;
s >> member2;
......
}
假如s满了(Save的时候)或者s数据不足(Load的时候),函数会等待,直到s可用或者出错退出。相当于进程的Stack帮我们保存了I/O状态的上下文。
但是现在要转到异步方式I/O,当s“不可用”的时候,线程应该中断当前的操作,把I/O状态的上下文保存下来,转而做其他的操作。
所以麻烦就来了,要自己做这个上下文的保存。一般来说要记录以下的内容:
1、操作到哪一个成员。
2、假如成员是一个普通的类型、那就要记录操作到类型的哪一个byte。
2、如果成员是一个复合类型,同样,递归地回到了1。
因此,上下文保存的结果一般都是一个自己做的stack,里面就是记录这个递归的过程。
其实想想,何苦为了省那几十k的空间折磨自己呢,例如输出,先用同步的方式把数据记录在内存,然后就记录内存的起始地址和长度,异步处理的时候就把内存输出,如果没有输出完的,就记下未输出部分的起始地址和长度,等待下一次。
不过当结果比较庞大的时候,还是需要自己慢慢苦干,真是悲惨……
博客主要讲述了数据结构存储从同步方式向异步方式转变时遇到的问题。同步存储时进程的 Stack 可保存 I/O 状态上下文,而异步时需自己保存上下文,一般用自定义 stack 记录递归过程。还提到可先同步记录数据到内存再异步输出。

被折叠的 条评论
为什么被折叠?



