Некая ф-ция в Длл выделяет память (по строку): Код (Text): invoke HeapAlloc, [intHeapHandle], 100, 100 ;выделяем 100 байт ; обработку ошибок опускаю... mov [lpMemoryBuffer], eax ; Запоминаем указатель на выделенную область lpMemoryBuffer объявлен в этой же ДЛЛ: Код (Text): section '.data' data readable writeable lpMemoryBuffer dd ? Меня мучают сомнения: будет ли это работать если эта функция будет вызываться несколькими потоками? Мне кажеться что в lpMemoryBuffer будет каша. Что тогда делать ? Заранее спасибо.
Это у тебя HeapAlloc(intHeapHandle,HEAP_FREE_CHECKING_ENABLED|HEAP_TAIL_CHECKING_ ENABLED|HEAP_GENERATE_EXCEPTIONS,100) Напиши лучше HeapAlloc(intHeapHandle,HEAP_ZERO_MEMORY,100), и "каши" в lpMemoryBuffer не будет. Будет.
IceStudent Сорри - туманно выразился. Я не про ту "кашу" имел виду. Поясню на примере: Два потока один за другим вызывают эту ф-цию. Первый выделил память, сохранил указатель в lpMemoryBuffer и работает с памятью, считая что указатель "правильный". В это время второй выделил память, сохранил указатель там же.... Тут третий поток подключился Т.о. в lpMemoryBuffer - указатель для последнего потока. Как разрулить такую ситуацию ? Спасет ли положение если я объявлю lpMemoryBuffer локальной переменной ? Типа Код (Text): proc GetMem..... local lpMemoryBuffer:DWORD ... endp
Спасёт. У каждого потока свой стек и lpMemoryBuffer будет локальным для потока. Или же заюзай TLS, он тоже локальный для потока.