Skip to content

LelouchHe/ddm

Repository files navigation

(v0.1) #介绍

##开发目的

在开发服务器程序的时候,经常需要一些动态词典,它们需要定期变动,而且服务器需要定期重新加载.这项功能使用的如此平凡,所以我觉得可以开发一个通用的的动态词典加载机制来完成这项工作,这样就可以把这个做的更高效更完善.

##依赖模块

由于开发是在linux下进行的,而且没有计划进行移植,所以目前只支持linux.额外的依赖模块为oop,提供定时器和各种通信机制.

##运行原理

对一个全局的动态词典管理器(即ddm),开辟一个单独的oop线程,来定时加载词典,并监听主线程对于oop的额外请求.这样所有的关于词典的操作,除了初始化之外,均有oop操作,而将线程间同步问题局限于队列操作,避免了复杂的线程同步和安全问题

##难点

有这样一个场景,线程a已经ref了一个dict,而此时需要重新加载dict,那么如何保证线程a拿到的dict仍然可以安全的使用呢?

基本的解决方法就是假设dict的正确性和完整性的重要性要高于词典的重载,因此我在词典背后保留了引用计数,只有当引用计数为0的时候,词典才能被释放并重新加载.

这样会不会造成一直使用旧词典呢?不会.每份词典保留了MAX_DICT_NUM(一般为2)个词典,一个当前使用,一个进行加载,当需要重载但没有空余词典时(即2个词典都有使用),那么这个词典不加载,并监听unref操作,当某个词典为0时,才进行加载.这个过程不会无限等待,因为新的ref只会使用当前index,必然另一个index只能减少不能增加,所以除非某个线程长时间使用一个旧词典不释放,那么必然会在某个点进行加载的.

##关于pipe

使用pipe而不是更重量级的同步原语,主要是因为oop可以监听fd,这样能把处理的逻辑更方便的组合起来,另一个原因是高级的同步原语可能消耗更大(这个是次要原因)

About

simple dyndict manager

Resources

Stars

Watchers

Forks

Packages

No packages published