OpenMP C и C ++ cout / printf не дают одинакового вывода - PullRequest
2 голосов
/ 16 декабря 2010

Я полный нуб в OpenMP и только начал изучать простой тестовый скрипт ниже.

#pragma omp parallel
    {
        #pragma omp for
            for(int i=0;i<10;++i)
            std::cout<<i<<" "<<endl;
         //   printf("%d \n",i);
    }
}

Я попробовал версию C и C ++, и версия C, кажется, работает нормально, тогда как версия C ++ дает мне неправильный вывод.

Ответы [ 2 ]

5 голосов
/ 16 декабря 2010

Многие реализации printf получают блокировку, чтобы гарантировать, что каждый вызов printf не прерывается другими потоками.

В отличие от этого перегруженный оператор std::cout << означает, что (дажес блокировкой) печать одного потока i и ' ' и '\n' может чередоваться с выводом другого потока, поскольку std::cout<<i<<" "<<endl; преобразуется в три вызова функции operator<<() компилятором C ++.

0 голосов
/ 21 ноября 2011

Это устарело, но, возможно, это еще может кому-нибудь помочь:

Не совсем понятно, что вы ожидаете получить, но помните:

  1. Ваша переменная "i" может быть разделена между потоками. У вас есть условие гонки для содержимого "я". Один поток должен ждать другого, когда он хочет получить доступ к «я». Кроме того, один поток может изменить «i», а другой поток не примет это к сведению, что означает, что он выведет неправильное значение.

  2. Endl () очищает память после окончания строки. Если вы используете \ n для перевода строки, эффект будет аналогичным, но без сброса. И std - это тоже объект, поэтому многопоточность борется за доступ к std. Когда память не очищается после каждого доступа, могут возникнуть помехи.

Чтобы убедиться, что они не связаны с вашими проблемами, вы можете объявить "i" как закрытое, чтобы каждый поток считал "i" сам. И вы можете поиграть с очисткой памяти на выходе, чтобы посмотреть, связано ли это с проблемой, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...