我是多线程的新手,并设计了一个程序,从两个微控制器接收数据,测量各种温度(环境和水)并将数据绘制到屏幕上。现在该程序是单线程的,它的性能很快。
我获得了多线程的基本设计方法,但还不足以创建一个执行任务的线程,但我没有得到的是如何让线程执行单独的任务并将数据放入共享数据池。我想我需要创建一个具有一个使用者和多个生成器的队列(想要使用std :: queue)。我在gtkmm线程文档中看到了一些显示单个Con / Pro队列的代码,他们会锁定队列对象产生数据并向睡眠线程发出信号表明它已完成然后生产者将进入休眠状态。对于我需要的东西,我需要睡一个线程,如果我没有睡眠任何线程会有数据冲突,并且会睡眠线程导致数据显着的数据延迟(我需要实时数据绘制30帧a秒)
我如何使用gtkmm / glibmm库编写这样的队列。
答案 0 :(得分:2)
如果你正在寻找一个无锁的实现,你将找不到。在编写数据结构时,某些东西需要保持两个线程同时更新数据结构并破坏它。
是否有任何理由你不能自己收集每个线程,使用它自己的结构,然后在最后结合结果?
答案 1 :(得分:2)
这是一个建议:
1.有两个线程,负责获取数据并放入缓冲区。每个线程都有自己的(循环)缓冲区
2.将有第三个线程负责从缓冲区获取数据并在屏幕上显示
3.屏幕线程向请求某些数据的数据线程发送消息,然后显示数据。这些消息有助于同步执行并避免死锁
4.所有线程都不应该“等待单个或多个对象”,而是轮询事件。
使用人物来思考这种情况。一个人正在提供水温读数。另一个人提供环境温度读数。第三个人接收或询问数据并显示数据(在白板上)。目标是让每个人在没有任何碰撞的情况下以最高效率运行。