OpenMP, как подождать потоки

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

OpenMP, как подождать потоки

Сообщение BratSinot »

Доброго времени суток!

Вообщем генерируем изображение:

Код: Выделить всё

 for(uintmax_t x=0; x<resox; x++)
 {
  static ROW_TYPE row[resox*3];
  for(uintmax_t y=0; y<resoy; y++)
  {
    ...
  }
  png_write_row(png_ptr, (png_bytep)row);

Хотел как сделать, чтобы вычисления происходили непрерывно, а строки записывались по порядку, т.е. что-то вроде этого:

Код: Выделить всё

  while(1)
  {
   if(x==0 || state[x-1])
   {
    png_write_row(png_ptr, (png_bytep)row);
    state[x] = 1;
    break;
   }
  }

Но оно не работает. Можно заставить работать, если добавить что-то вроде:

Код: Выделить всё

  while(1)
  {
   if(x==0 || state[x-1])
   {
    png_write_row(png_ptr, (png_bytep)row);
    state[x] = 1;
    break;
   }
   usleep(1);
  }

Но это не решение проблемы, ибо оно работает еще дольше, да и то через раз.
Отсюда следует вполне очевидный вывод, что while(1) сжирает все процессорное время и отсюда следует вопрос: "Как это сделать правильно"?
P.S. Переходить с OpenMP на что-нибудь другое не очень хочется.

Вообщем до чего дошел, с помощью pthreads создал "постоянный" поток, в котором отслеживаю готовность кусков и записываю их последовательно (ну и память динамическая, malloc/free).
Спасибо сказали: