以前一直都是做同步方式的数据结构存储。即典型的:
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的空间折磨自己呢,例如输出,先用同步的方式把数据记录在内存,然后就记录内存的起始地址和长度,异步处理的时候就把内存输出,如果没有输出完的,就记下未输出部分的起始地址和长度,等待下一次。
不过当结果比较庞大的时候,还是需要自己慢慢苦干,真是悲惨……