c++ - 寻找设计建议 - 统计记者

标签 c++ multithreading concurrency

我需要实现一个统计报告器——一个打印到屏幕上的统计数据的对象。 此信息由 20 个线程更新。

报告者本身必须是一个线程,每 1 秒唤醒一次,读取信息并将其打印到屏幕。

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

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

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

最佳答案

我想说的是,首先,Reporter 本身应该是一个线程。将绘图部分与事件代码 (MVC) 隔离是解耦的基础。

结构本身在这里用处不大。当您根据多线程进行推理时,与其说是结构,不如说是您应该检查的信息流。

此处有 20 个事件线程将更新信息,1 个被动线程将显示信息。

这里的问题是,由于 active 线程无法获取锁(用于显示),您会遇到在要完成的工作中引入一些延迟的风险。报告(或日志记录)不应阻塞(或尽可能少)。

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

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

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

注意:就个人而言,我不喜欢您的结构。工作线程必须确切地知道它应该更新的元素在屏幕上的显示位置,这显然违反了封装。

再一次,查找 MVC。

而且由于我对模式很感兴趣:也可以查看 Observer ;)

关于c++ - 寻找设计建议 - 统计记者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448160/

相关文章:

c++ - std::reference_wrapper *this 周围

c++ - 如何使用 initializer_ist 在构造函数中初始化动态数组?

c++ - 将 vector<vector<int>> 的最后一个元素移动到开头

检查__thread关键字是否可用

python - 为什么python 2.5中threading.Thread通过阻塞执行来同步操作?

Java:notifyObservers不并发?

iphone - iOS并发/版本分发

c++ - const_cast 的这种用法在实践中是否未定义?

c++ - 线程安全队列有问题吗?

matlab - 验证 .mat 文件存在且未损坏 - Matlab