Я сделал эту простую тестовую программу, и она иногда вызывает прерывание отладки или просто дает сбой (в Debug / Win32 / VS2010SP1) - и, конечно же, иногда она даже работает. Я что-то делаю неправильно или где-то есть ошибка в PPL (VS2010)?
#include "stdafx.h"
#include <ppl.h>
#include <vector>
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vi;
Concurrency::critical_section cs;
Concurrency::parallel_for(0, 10000, [&](int i)
{
Concurrency::critical_section::scoped_lock l(cs);
vi.push_back(i);
});
return 0;
}
Стек вызовов Debug Break выглядит следующим образом:
Один сбой, который у меня только что появился, похоже, что блокировка не была удержана (cs: not_locked)
Lockable.exe! Std :: vector> :: _ Orphan_range (int * _First = 0x0000c5db, int * _Last = 0x0000c5db) Строка 1442 + 0x5 байт C ++ Lockable.exe! Std :: vector> :: push_back (const int & _Val = 4177 ) Строка 995 C ++
Lockable.exe! anonymous namespace'::<lambda0>::operator()(int i=4177) Line 16 C++
Lockable.exe!Concurrency::_Parallel_chunk_helper_invoke<int,unsigned int,
anonymous namespace '::, 0> :: _ Invoke (const int & _First = 0, unsigned int & _Index = 4177, const anonymous-namespace'::<lambda0> & _Func={...}) Line 1445 C++
Lockable.exe!Concurrency::_Parallel_chunk_helper<int,unsigned int,
anonymous namespace' ::, 0> :: operator () () Строка 1833 + 0x16 байт C ++ Lockable.exe! Concurrency :: task_handle, 0>>> (Concurrency :: task_handle, 0>> * _PChore = 0x7cbffc24 {_M_first = 0 _M_step = 1 _M_function = {...} ...}) Строка 3495 C ++ msvcr100d.dll! Concurrency :: details :: _ UnrealizedChore :: _ StructuredChoreWrapper (Concurrency :: details :: _ UnrealizedChore * pChore = 0x7cbffc24 {_M_first = 0 _M_step = 1 _M_function = {...} ...}) Строка 99 + 0xc байтов C ++ msvcr100d.dll! Параллелизм :: подробности :: _ UnrealizedChore :: _ Invoke () Строка 3454 + 0xc байтов C ++ msvcr100d.dll! Параллелизм :: подробности :: WorkItem :: Invoke () Строка 75 C ++ msvcr100d.dll! Параллелизм :: подробности :: InternalContextBase :: ExecuteChoreInline (Concurrency :: details :: WorkItem * pWork = 0x7bc0fab4) Строка 1385 C ++ msvcr100d.dll! Concurrency :: details :: InternalContextBase :: Dispatch (Concurrency :: DispatchState * pDispatchState = 0x7bc0 fad4) Строка 1478 C ++ msvcr100d.dll! Concurrency :: details :: FreeThreadProxy :: Dispatch () Строка 157 C ++ msvcr100d.dll! Concurrency :: details :: ThreadProxy :: ThreadProxyMain (void * lpParameter = 0x2dcf6200) Строка 162 C ++ kernel32. dll! 763c33aa ()
[Фреймы ниже могут быть неправильными и / или отсутствующими, символы для kernel32.dll не загружены]
ntdll.dll! 771a9ef2 ()
ntdll.dll! 771a9ec5 ()
И могут быть другие нарушения произвольного доступа даже внутри внутренней реализации PPL, которые, я думаю, вы могли бы воспроизвести. (с надеждой)
Я запустил ту же программу в Visual Studio 2012 Express для настольных ПК, и после многих тестовых запусков, похоже, все работает правильно.
Мне интересно, если PPL под VS2010 глючит для использования в производственной среде?
Спасибо за любой вклад!
Итак, наконец, после публикации вопроса в Microsoft Connect (или в социальных сетях?) Проблема была подробно объяснена.