У меня есть генератор изображений, который выиграл бы от работы в потоках. Я собираюсь использовать потоки POSIX и написал несколько макетов на основе https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal для проверки.
В предполагаемой программе, когда используется графический интерфейс, я хочу, чтобы сгенерированные строки появлялись сверху вниз по очереди (генерация изображения может быть очень медленной).
Следует также отметить, что данные, созданные в потоках, не являются фактическими данными изображения. Данные потока считываются и преобразуются в данные RGB и помещаются в фактический буфер изображения. А в графическом интерфейсе способ преобразования сгенерированных потоком данных в данные RGB может быть изменен во время генерации изображения без остановки генерации изображения.
Однако от планировщика потоков нет никакой гарантии, что потоки будут работать в нужном мне порядке, что, к сожалению, усложняет преобразование сгенерированных потоком данных, что подразумевает нежелательное решение сохранения массива для хранения значения bool для указать, какие строки сделаны.
Как мне с этим бороться?
В настоящее время у меня есть поток наблюдателя, который сообщает, когда изображение завершено (что на самом деле должно быть для индикатора выполнения, но я еще не дошел до этого, вместо этого он использует pthread_cond_wait
). И несколько потоков рендеринга делают while(next_line());
next_line()
выполняет блокировку мьютекса и получает значение img_next_line перед тем, как увеличить его и разблокировать мьютекс. затем он рендерит строку и выполняет блокировку мьютекса (отличную от первой), чтобы получить с помощью lines_done проверки высоты, сигналы, если они выполнены, разблокировать и вернуть 0, если выполнено, или 1, если нет.