观察者模式 - 竞争条件

时间:2015-04-26 16:01:36

标签: c++ oop design-patterns object-oriented-analysis

我想对您在C ++中的OO应用程序中找到的以下用法有所了解,以及您认为它是正确还是错误。 我们使用观察模式对imeplement模型 - 视图 - 控制器进行如下操作:

 (Subject) (notify) (Listeners) 
 controller    --->  DB
               --->  Viewer

依赖于DB首先被注册到控制器(在Viewer之前)的事实是正确的,因此将在Viewer之前更新。这很重要,因为当Viewer得到通知时,它会从DB读取信息(因为它假定数据库已经更新)。

编辑: 控制器和查看器是线程,而DB不是。 控制器始终先通知DB,然后通知Viewer。 该应用程序正常工作。 我只是认为在查看器之前注册数据库是一件很难看的事情,并希望得到你的意见。

谢谢,

1 个答案:

答案 0 :(得分:1)

我建议另一种解决此问题的方法,因为你的数据库访问层有这里需要的钩子。

情况分析: 鉴于数据库更新可能会失败,您的视图可以执行不需要的更新。如果您有分布式应用程序,这可能会导致严重的性能问题。

接下来是:您的数据库更新可能需要比视图通知更长的时间,以便视图在更新时读取旧数据。 (想想这就是你所看到的竞争条件)。

<强>解决方案: 在数据库访问层上放置CommitFinished之类的钩子,以便更新视图。

因此,更有效的方法是:

1)改变=&gt;控制器=&gt; DB

2)数据库提交完成(某些DataChanged挂钩会做)=&gt; controller =&gt;图