У меня есть проект Visual Studio 2008 C++ для Windows Mobile 6 ARMV4I, где я использую файлы с отображением памяти. К сожалению, это приводит к блокировке устройства. Я могу продемонстрировать проблему с этим кодом:
#include <list>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD alloc_size = 256;
DWORD alloc_max = 16 * 1024 * 1024;
DWORD alloc_count = alloc_max / alloc_size;
HANDLE f = ::CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, alloc_max, NULL );
std::list< void* > l;
for( DWORD i = 0; i < alloc_count; ++i )
{
// device freezes after 65529 iterations
l.push_back( ::MapViewOfFile( f, FILE_MAP_READ | FILE_MAP_WRITE, 0, i * alloc_size, alloc_size ) );
}
std::for_each( l.rbegin(), l.rend(), ::UnmapViewOfFile );
::CloseHandle( f );
return 0;
}
Эмулятор Windows Mobile 6 Classic зависает после 65529 итераций в моем тестировании. Это что-то, что я делаю неправильно, или есть проблема с платформой, о которой я должен знать?
Спасибо, PaulH
Изменить: увеличение до /STACK:1048576,4096 позволяет выполнить 65535 итераций, прежде чем устройство зависнет.
Edit2: Согласно GlobalMemoryStatus
непосредственно перед сбоем, на устройстве имеется 70,5 МБ / 94,1 МБ свободной физической памяти.
Edit3: я могу создать два MMF и загрузить их оба размером до 65500 * 256 байт. Но ни один из них не может по отдельности превышать 65535 выделений. На самом деле, размер alloc не имеет значения. Я могу сократить его пополам до 128 байт каждый, но все равно терплю >65535 итераций.
Edit4: Поддержка MMF реальным файлом, похоже, не имеет значения. Сбой в > 65535 итерациях.