【问题标题】:Using threads, how should I deal with something which ideally should happen in sequential order?使用线程,我应该如何处理理想情况下应该按顺序发生的事情?
【发布时间】:2011-01-02 09:20:12
【问题描述】:

我有一个图像生成器,它将受益于在线程中运行。我打算使用 POSIX 线程,并基于https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 编写了一些模拟代码来测试。

在预期的程序中,当使用GUI时,我希望生成的线条从上到下一一出现(图像生成可能很慢)。

还需要注意的是,线程中生成的数据并不是实际的图像数据。线程数据被读取并转换为 RGB 数据并放入实际的图像缓冲区中。在 GUI 中,可以在图像生成期间更改线程生成的数据转换为 RGB 数据的方式,而无需停止图像生成。

但是,线程调度程序不能保证线程将按照我想要的顺序运行,不幸的是,这使得线程生成的数据的转换变得更加棘手,这意味着保持数组保存 bool 值的不良解决方案指出哪些行已完成。

我该如何处理?

目前我有一个观察者线程来报告图像何时完成(这确实应该是一个进度条,但我还没有那么远,它改为使用pthread_cond_wait)。还有几个渲染线程在做while(next_line());

next_line() 执行互斥锁,并获取 img_next_line 的值,然后将其递增并解锁互斥锁。然后它渲染该行并执行互斥锁(与第一个不同)以获取lines_done 检查高度,如果完成则发出信号,解锁并在完成时返回0,否则返回1。

【问题讨论】:

  • 只是想我最好提一下,上面的观察者线程、渲染线程和 next_line 函数的实现在没有 GUI 的情况下工作复杂的事情。

标签: c linux image-processing posix pthreads


【解决方案1】:

这可能听起来很傻,但作为用户,我不希望看到一行从上到下缓慢呈现。它使缓慢的过程看起来更慢,因为用户已经完全预测了接下来会发生什么。最好在准备好的时候渲染,即使它分散在整个地方(或者像一些人建议的那样作为单行或更好的块)。它使它看起来更随机,因此对像我这样的用户来说更迷人,也更不乏味。

【讨论】:

    【解决方案2】:

    鉴于线程很可能在不同的内核上并行执行,结果将无序到达几乎是不可避免的。我认为您使用一组标志来跟踪完整内容的方法是非常合理的。

    如果使用不同粒度的线程,整体效果可能会更好。假设给每个线程(比如说)20 行而不是 1 行。然后在完成后,您将有更大的块可用于绘制,也许绘制条纹看起来不错?

    【讨论】:

    • 有趣的是,您提到每个线程工作多行而不是 1 行。在我走到这一步之前,我曾在其他地方寻求通用方法,有人提到处理块,比如 20x20 大小。
    【解决方案3】:

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

    【讨论】:

    • 绝对不想在这里浪费 CPU 时间。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2017-11-11
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多