寻找设计咨询 - 统计记者

时间:2010-03-15 15:13:57

标签: c++ multithreading concurrency

我需要实现一个统计报告器 - 一个打印到屏幕上的统计信息的对象。 此信息由20个主题更新。

记者必须是一个每1秒唤醒一次的线程,阅读信息并将其打印到屏幕上。

到目前为止我的设计: InfoReporterElement - 信息的一个元素。有两个函数,PrintInfo和UpdateData。                    InfoReporterRow - 屏幕上有一行。一行包含ReporterInfoElement的向量。                    InfoReporterModule - 由标题和行向量组成的模块。                    InfoRporter - 由一组模块和一个标题组成的记者。记者导出遍历所有模块\行\基本元素的函数'PrintData',并将数据打印到屏幕上。

我认为我应该负责从线程接收更新并更新基本信息元素。

主要问题是如何更新信息 - 我应该为对象使用一个互斥锁还是每个基本元素使用互斥锁? 另外,哪个对象应该是线程 - 报告者本身,还是从线程接收更新的线程?

4 个答案:

答案 0 :(得分:1)

  

主要问题是如何更新   info - 我应该使用一个互斥量   对象或每个基本元素使用互斥?

在更新操作的基本单元周围放置一个互斥锁。如果这是InfoReporterElement对象,则每个此类对象需要一个互斥锁。否则,如果一次更新一行,则由任何一个线程将该互斥锁放在该行周围,依此类推。

  

另外,哪个对象应该是一个线程    - 记者本身,还是收到线程更新的那个?

您可以将它们全部放在不同的线程中 - 更新信息的多个编写器线程和读取值的一个读取器线程。

答案 1 :(得分:1)

我想首先,Reporter本身应该是一个主题。它是基于解耦以将绘图部分与活动代码(MVC)隔离的基础。

结构本身在这里用处不大。当您使用多线程进行推理时,其结构与您应该检查的信息流量的关系不同。

这里有20个活动主题用于更新信息,1个被动主题将显示该主题

这里的问题是你遇到了在工作中引入一些延迟的风险,因为活动线程无法获取锁(用于显示)。报告(或记录)不应该阻止(或尽可能少)。

我建议引入一个中间结构(和线程)来分离GUI和工作:排队线程。

  • 活动主题将事件发布到队列
  • 排队线程更新上面的结构
  • 显示的主题显示当前状态

您可以使用与Graphics相同的构思来避免某些同步问题。使用2个缓冲区:当前的缓冲区(由显示线程显示)和下一个缓冲区(由排队线程更新)。当排队线程处理了一批事件时(由你决定批处理是什么),它要求交换2个缓冲区,以便下次显示的线程显示新的信息。

注意:更个人化的说法,我不喜欢你的结构。工作线程必须准确知道它应该更新的元素在屏幕上的哪个位置,这明显违反了封装。

再一次,查找MVC。

因为我的模式很深入:查找Observer;)

答案 2 :(得分:0)

您似乎非常了解并发的基础知识。

我的初衷是一个队列,它有一个锁定写入和删除的互斥锁。如果你有时间,我会看看无锁访问。

对于你的第二个问题,我只有一个读者线程。

答案 3 :(得分:0)

一段代码可以很好地操作。

将互斥锁附加到每个InfoReporterElement。正如你在评论中写的那样,你不仅需要获取和设置元素值,还要增加它或者可能做其他的东西,所以我要做的是为每个互锁操作制作一个互斥成员函数我需要。