Используя потоки, как я должен иметь дело с чем-то, что в идеале должно происходить в последовательном порядке? - PullRequest
1 голос
/ 07 января 2010

У меня есть генератор изображений, который выиграл бы от работы в потоках. Я собираюсь использовать потоки 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, если нет.

Ответы [ 3 ]

2 голосов
/ 07 января 2010

Учитывая, что потоки вполне могут выполняться параллельно на разных ядрах, неизбежно, что результаты будут получены не по порядку. Я думаю, что ваша оценка слежения за комплектом флагов вполне разумна.

Вполне возможно, что общий эффект может быть лучше, если используются потоки с другой гранулярностью. Скажем, дайте каждому потоку (скажем) 20 строк для работы, а не одну. Тогда по завершении у вас будут большие блоки, доступные для рисования, и, возможно, рисование полос будет выглядеть нормально?

1 голос
/ 07 января 2010

Просто примите, что строки будут выполнены в недетерминированном порядке; Похоже, это происходит потому, что на рендеринг уходит разное время, и в этом случае принудительное выполнение ордера на завершение будет тратить процессорное время.

0 голосов
/ 14 января 2010

Это может звучать глупо, но как пользователь, я не хочу, чтобы одна строка отображалась медленно сверху вниз. Это делает медленный процесс еще более медленным, потому что пользователь уже полностью предсказал, что будет дальше. Лучше просто визуализировать, когда будете готовы, даже если он разбросан по всему месту (либо в виде отдельных строк, либо еще лучше, как блоки, как некоторые предлагали). Это делает его более случайным и, следовательно, более привлекательным и менее скучным для такого пользователя, как я.

...