多线程处理数据操作的一个小问题,希望大家多多帮忙!
我没处理过这种问题,想问问大家啊
是这样的,我目前有三个class:
1.WriteDB他主要负责把网页的信息写到数据中(间隔5分钟),每次更新之后都会他会相应的把DataOperation中的变量isDataUpdate_设置为true
2.Search他负责处理对用户执行查询信息的操作,当有用户执行Search,他会相应的把DataOperation中的变量isUserSearch_设置为true
3.DataOperation这是一个中间的类,负责做类WriteDB和类Search的同步操作,会一直检查这两个变量isDataUpdate_和isUserSearch_,当他们都为false的时候,把最新在内存中的数据库写入到对应的文件中,以便能够查询最新的信息,如果其中一个为true,他都等待
我的问题是,这个DataOperation要怎样操作,才能满足这种目的啊?
希望大家多多帮忙!谢谢哈! 多线程 类 数据库 行业数据 同步操作
[解决办法]
不用设置2个变量true和false来同步控制你所说的流程。
如果是我做,我会这样设计。
更新DB的线程间隔时间长(5分钟1次),用户查询DB间隔时间不定,写文件的线程是更新DB后才执行。
同步3个线程需要1个关键段(或者叫做临界区,CRITLCAL_SECTION),1个事件(EVENT)
每个线程在执行自己的工作前,都用关键段进行同步,执行完离开关键段。
DB线程:
等待计时器的信号(5分钟触发1次)
enter CS(关键段)
把网页的信息写到数据中
leave CS
setevent(设置好的事件HANDLE)
search 线程
有用户要查询
enter CS
查询
leave CS
写文件的线程
waitforsingleobject(事件HANDLE)
enter CS
写文件
leave CS
继续去waitfor事件
[解决办法]
不必这么麻烦:
WriteDB,每写一次,就设置一次isDataUpdate_为true
DataOperation中,有3个变量,一个是isDataUpdate_(这个是bool变量),一个是isUserSearch_(这应该是一个条件变量---和互斥量不是一个含义,注意区分),还有一个是互斥量;假如当前正在更新数据库,即使条件变量满足(满足的条件是没有用户在查询),锁定互斥量
Search,每次用户查询都会把DataOperation中的条件变量查看一下,如果当前没有在更新数据库,行,直接锁定互斥量,那么就算是DataOperation中的条件满足也不会更新。
这样就可以轻松解决问题
你的耦合,也仅限于DataOperation和Search