Убить поток. Освободить память.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by totenkopf, 17 Jan 2014.

  1. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    UPD: Решение найдено прошу удалить

    Есть многопоточная программа. В силу ее особенностей иногда происходит зависание некоторых потоков.
    Зависший поток убивается с помощью TerminateThread, но при этом выделенная потоком память не освобождается.
    Внутри кода потока очистить ее не получится, и висит наглухо. В итоге наступает "out of memory" при длительной работе.
    Можно ли из основной программы как-нибудь очистить ресурсы потока и убить его?
    Нашел вариант:
    Code:
    void KillThread(HANDLE threadHandle)
    {
    	SuspendThread(threadHandle);
    	RtlFreeUserThreadStack(GetCurrentProcess(), threadHandle);
    	TerminateThread(threadHandle, 0); 
    	CloseHandle(threadHandle);
    }
    
    Вроде и то что надо, но функция RtlFreeUserThreadStack не экспортируется из ntdll.dll в Windows 7.
    Может кто знает как решить проблему?
     
    #1 totenkopf, 17 Jan 2014
    Last edited: 17 Jan 2014
  2. madhatter

    madhatter Member

    Joined:
    7 Aug 2013
    Messages:
    562
    Likes Received:
    50
    Reputations:
    54
    Я немного не в тему, но.. Название топика очень порадовало. Тянет на эталонный летний попкорновый боевичок. В msdn на эту тему наверняка что-нибудь должно быть. Или какой-нибудь garbage collector или деструктор на случай смерти потока.
     
  3. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    Да уж боевик :) Прога на assembler-e
    Спасибо всем решил все.