4

我是多线程的新手,并且设计了一个程序,该程序从两个测量各种温度(环境和水)的微控制器接收数据并将数据绘制到屏幕上。现在这个程序是单线程的,它的性能很糟糕。

我获得了多线程的基本设计方法,但不足以创建线程来执行任务,但我没有得到的是如何让线程执行单独的任务并将数据放入共享数据池中。我想我需要创建一个包含一个消费者和多个生产者的队列(想使用 std::queue)。我在 gtkmm threading docs 上看到了一些代码,它们显示了单个 Con/Pro 队列,它们会锁定队列对象产生数据并向睡眠线程发出信号,表明它已完成,然后生产者将进入睡眠状态。对于我需要的东西,我需要让一个线程休眠,如果我没有让任何线程休眠,是否会出现数据冲突,并且休眠一个线程会导致数据显着的数据延迟(我需要绘制 30 帧的实时数据)秒)

我将如何使用 gtkmm/glibmm 库对这样的队列进行编码。

4

2 回答 2

2

如果您正在寻找一个无锁的实现,您将找不到。当数据结构被写入时,需要一些东西来防止两个线程同时更新数据结构并破坏它。

有什么理由你不能让每个线程自己收集,用它自己的结构,然后在最后结合结果?

于 2010-04-28T16:15:46.020 回答
2

这里有一个建议:
1. 有两个线程,负责获取数据并放入缓冲区。每个线程都有自己的(循环)缓冲区。
2. 将有第三个线程负责从缓冲区中获取数据并在屏幕上显示。
3. screen线程向数据线程发送消息请求一些数据,然后显示数据。这些消息有助于同步执行并避免死锁。
4. 任何线程都不应该“等待单个或多个对象”,而是轮询事件。

想想这个使用人的场景。一个人正在提供水温读数。另一个提供环境温度读数的人。第三人接收或请求数据并显示数据(在白板上)。目标是让每个人都以最高效率运行而不会发生任何冲突。

于 2010-04-28T16:31:30.977 回答