读书人

多线程处理数据操作的一个小疑点希望

发布时间: 2013-08-01 15:23:18 作者: rapoo

多线程处理数据操作的一个小问题,希望大家多多帮忙!
我没处理过这种问题,想问问大家啊

是这样的,我目前有三个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事件

[解决办法]

引用:
Quote: 引用:

WriteDB和Search线程操作完成后,给DataOperation发一个事件,DataOperation检查2个flag

Search线程这是等待用户输入查询条件返回结果的,他结束 程序就退出了。
所以才会想到用一个isUserSearch_来标识当前是否有用户正在进行查询操作

不必这么麻烦:
WriteDB,每写一次,就设置一次isDataUpdate_为true

DataOperation中,有3个变量,一个是isDataUpdate_(这个是bool变量),一个是isUserSearch_(这应该是一个条件变量---和互斥量不是一个含义,注意区分),还有一个是互斥量;假如当前正在更新数据库,即使条件变量满足(满足的条件是没有用户在查询),锁定互斥量

Search,每次用户查询都会把DataOperation中的条件变量查看一下,如果当前没有在更新数据库,行,直接锁定互斥量,那么就算是DataOperation中的条件满足也不会更新。


这样就可以轻松解决问题
你的耦合,也仅限于DataOperation和Search

读书人网 >C++

热点推荐