代码之家  ›  专栏  ›  技术社区  ›  James Morris

使用线程,我应该如何处理一些理想情况下应该按顺序发生的事情?

  •  1
  • James Morris  · 技术社区  · 15 年前

    我有一个图像生成器,它可以从运行线程中获益。我打算使用POSIX线程,并编写了一些基于 https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 去测试一下。

    在预期的程序中,当使用GUI时,我希望生成的行从上到下依次出现(图像生成可能非常慢)。

    还应该注意,线程中生成的数据不是实际的图像数据。线程数据被读取并转换为RGB数据,并放入实际的图像缓冲区。在图形用户界面中,线程生成的数据转换为RGB数据的方式可以在图像生成过程中更改,而无需停止图像生成。

    然而,线程调度程序无法保证线程将按我想要的顺序运行,这使得线程生成的数据的转换更加棘手,这意味着保留数组以保存bool值以指示完成了哪些行的不需要的解决方案。

    我该怎么处理?

    目前,我有一个观察线程来报告图像完成的时间(这实际上应该是一个进度条,但我还没有到那么远的时间,而是使用 pthread_cond_wait )和几个渲染线程 while(next_line());

    next_line() 执行互斥锁,并在递增和解锁互斥锁之前获取img_next_行的值。然后,它渲染该行并执行互斥锁(与第一个不同),以获取行的高度检查、完成时的信号、完成时的解锁以及完成时的返回0或不完成时的返回1。

    3 回复  |  直到 15 年前
        1
  •  2
  •   djna    15 年前

    考虑到线程很可能在不同的核心上并行执行,结果将不可避免地出现无序。我认为你用一组标志来跟踪完整的内容是很合理的。

    如果使用不同粒度的线程,整体效果可能会更好。假设给每个线程20行,而不是一行。完成后,你会有更大的块可以画,也许画条纹会看起来不错?

        2
  •  1
  •   Andrew McGregor    15 年前

    只需接受行将以不确定的顺序完成;这听起来像是在发生,因为它们需要不同的时间来呈现,在这种情况下,强制完成顺序将浪费CPU时间。

        3
  •  0
  •   Apprentice Queue    15 年前

    这听起来可能很傻,但作为一个用户,我不想看到一行从上到下慢慢呈现。这使得一个缓慢的过程看起来更慢,因为用户已经完全预测了接下来会发生什么。最好在准备好的时候进行渲染,即使它分散在该位置上(可以是单行,也可以是一些建议的块)。它使它看起来更随意,因此对我这样的用户来说更吸引人,也不那么无聊。