Вызов ф-ции ДЛЛ несколькими потоками

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 3 апр 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Некая ф-ция в Длл выделяет память (по строку):


    Код (Text):
    1.   invoke HeapAlloc, [intHeapHandle], 100, 100 ;выделяем 100 байт
    2.   ; обработку ошибок опускаю...
    3.   mov [lpMemoryBuffer], eax ; Запоминаем указатель на выделенную область
    4.  




    lpMemoryBuffer объявлен в этой же ДЛЛ:
    Код (Text):
    1.  
    2. section '.data' data readable writeable
    3.   lpMemoryBuffer dd ?
    4.  






    Меня мучают сомнения: будет ли это работать

    если эта функция будет вызываться несколькими потоками?



    Мне кажеться что в lpMemoryBuffer будет каша.



    Что тогда делать ?



    Заранее спасибо.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Это у тебя HeapAlloc(intHeapHandle,HEAP_FREE_CHECKING_ENABLED|HEAP_TAIL_CHECKING_ ENABLED|HEAP_GENERATE_EXCEPTIONS,100)



    Напиши лучше HeapAlloc(intHeapHandle,HEAP_ZERO_MEMORY,100), и "каши" в lpMemoryBuffer не будет.





    Будет.
     
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    IceStudent

    Сорри - туманно выразился.

    Я не про ту "кашу" имел виду.



    Поясню на примере:

    Два потока один за другим вызывают эту ф-цию.

    Первый выделил память, сохранил указатель в lpMemoryBuffer и работает с памятью, считая что указатель "правильный".

    В это время второй выделил память, сохранил указатель там же.... Тут третий поток подключился



    Т.о. в lpMemoryBuffer - указатель для последнего потока.



    Как разрулить такую ситуацию ?

    Спасет ли положение если я объявлю lpMemoryBuffer локальной переменной ?

    Типа
    Код (Text):
    1.  
    2. proc GetMem.....
    3. local lpMemoryBuffer:DWORD
    4. ...
    5.  
    6. endp
    7.  
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Спасёт. У каждого потока свой стек и lpMemoryBuffer будет локальным для потока. Или же заюзай TLS, он тоже локальный для потока.
     
  5. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    А что есть TLS ?

    Где почитать про него ?



    Заранее спасибо.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В инете. И мсдн: TlsAlloc, TlsFree, TlsGetValue, TlsSetValue.