代码之家  ›  专栏  ›  技术社区  ›  Talguy

多生产者单消费者队列

  •  4
  • Talguy  · 技术社区  · 15 年前

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

    我得到了多线程的基本设计方法,但还不能很好地创建一个线程来完成一个任务,但我没有得到的是如何让线程执行单独的任务,并将数据放入一个共享的数据池。我想我需要做一个有一个消费者和多个生产者的队列(想使用STD::队列)。我在gtkmm线程文档中看到了一些代码,它们显示了一个con/pro队列,它们会锁定queue对象,生成数据并向休眠线程发出信号,表明它已经完成,然后生产者将休眠。对于我所需要的,我需要睡眠线程,如果我不睡眠任何线程是否会有数据冲突,睡眠线程是否会导致数据显著延迟(我需要实时数据以每秒30帧的速度绘制)

    如何使用gtkmm/glibmm库来编写这样的队列。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Thomas Matthews    15 年前

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

    想想这个用人的场景。一个人正在传送水温读数。另一个人提供环境温度读数。第三方接收或请求数据并显示数据(在白板上)。我们的目标是让每个人都能在没有任何冲突的情况下以最大的效率工作。

        2
  •  2
  •   Billy ONeal IS4    15 年前

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

    有没有什么原因不能让每个线程单独收集,使用自己的结构,然后在最后合并结果?