Пользователи




Ресурсы для разработчиков

Блог

05.02.2010 Ключ /Wp64 и ошибка с обработкой шаблонов
Занимаясь продвижением анализатора Viva64 (из состава PVS-Studio) мы часто комментируем ключ /Wp64 из Microsoft Visual C++.»

03.02.2010 Параллельные заметки №1 – технология OpenMP
В ближайшие несколько постов мы расскажем о практическом использовании многоядерных процессоров.»

29.01.2010 64-битные технологии - еще одно направление в современном программном обеспечении
В блогах и форумах довольно много говорится о многоядерных процессорах, как очевидном этапе развития компьютерных систем.»

Blog RSS

Новости

2.02.2010 На нашем сайте стали доступны "Уроки разработки 64-битных приложений на языке Си/Си++".»

1.02.2010 Выпущена новая версия PVS-Studio 3.45!»

21.01.2010 Выпущена новая версия PVS-Studio 3.44!»

Новости RSS

Статьи

10.12.2009 Вопросы и ответы по PVS-Studio (PVS-Studio FAQ)
В документе собраны некоторые вопросы и ответы по анализатору кода PVS-Studio компании ООО "СиПроВер".»

09.12.2009 Вопросы и ответы по библиотеке VivaCore (VivaCore FAQ)
В документе собраны некоторые вопросы и ответы по библиотеке анализа Си/Си++ кода VivaCore компании ООО "СиПроВер".»

23.11.2009 PVS-Studio: использование функции "Mark as False Alarm"
В статье приведены описание и пример использования новой функции PVS-Studio 3.40 "Mark as False Alarm" ("Пометить как ложное срабатывание").»

Статьи RSS

Документация

PVS-Studio Send comments on this topic.
V1205. Data race risk. Unprotected concurrent operation with the NN variable

Анализатор обнаружил в коде ошибку, вызванную одновременной работой потоков с общей переменной. Рассмотрим пример некорректного кода: 

  CopyCode image Copy Code
int a = 0;
#pragma omp parallel for num_threads(4)
for (int i = 0; i < 100000; i++)
{
a++;
}

Поскольку все потоки пишут в одну и ту же область памяти и читают из нее одновременнно, значение переменной после этого цикла является непредсказуемым. Чтобы обезопасить эту операцию, ее нужно поместить в критическую секцию, либо (поскольку в данном примере операция является элементарной) использовать директиву «#pragma omp atomic». Второй вариант является более предпочтительным, так как приводит к более быстрому коду:

  CopyCode image Copy Code
int a = 0;
#pragma omp parallel for num_threads(4)
for (int i = 0; i < 100000; i++)
{
#pragma omp atomic
a++;
}

Если же тип операции не позволяет использовать директиву «#pragma omp atomic», можно воспользоваться критическими секциями или блокировками. Критические секции являются более предпочтительным решением, так как они работают быстрее:

  CopyCode image Copy Code
int a = 0;
#pragma omp parallel for num_threads(4)
for (int i = 0; i < 100000; i++)
{
#pragma omp critical
{
...
}
}

Отметим, что V1205 не возникнет, если переменная является локальной, или код гарантированно выполняется только одним потоком (например, находится в области действия директивы «#pragma omp single»).