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

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

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

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

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

我应该怎么处理这个?

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

next_line()执行互斥锁定,并在递增它并解锁互斥锁之前获取img_next_line的值。 它然后呈现该行并执行互斥锁(与第一个不同)以获得line_done对高度的检查,如果完成则发出信号,解锁并在完成时返回0或如果不完成则返回1。

鉴于线程可能在不同的内核上并行执行,因此结果将无序地到达是不可避免的。 我认为你用一组标志跟踪完成内容是非常合理的。

如果以不同的粒度使用线程,整体效果可能会更好。 比如给每个线程(比方说)20条线路而不是一条线路。 然后在完成时你会有更大的块可供绘制,也许绘制条纹看起来不错?

只需接受行将以非确定性顺序完成; 这听起来似乎正在发生,因为它们需要不同的时间来渲染,在这种情况下强制完成命令会浪费CPU时间。

这可能听起来很傻但作为用户我不希望看到一条线从上到下缓慢渲染。 它使得缓慢的过程看起来更慢,因为用户已经完全预测了接下来会发生什么。 最好只在准备就绪时进行渲染,即使它散布在整个地方(无论是单线还是更好的块,如某些人所建议的那样)。 这使得它看起来更随机,因此对于像我这样的用户来说更具吸引力且更少无聊。