Вопрос по c++, dll, multithreading, windows – Как правильно завершить висящую нить внутри dll?

2

Hi Everybody,

У меня есть сторонняя библиотека, которая содержит ошибку. Когда я вызываю функцию, она может зависнуть. Функция библиотеки вызывается внутри DLL. Я решил перенести звонок в ветку и подождать некоторое время. Если нить закончена, тогда ОК. Если нет & # x2013; Я должен прекратить это в обязательном порядке.

Упрощенный пример здесь:

<code>unsigned Counter = 0;
void f()
{
    HANDLE hThread;
    unsigned threadID;

    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, DoSomething, NULL, 0, &threadID );

    if (WAIT_TIMEOUT == WaitForSingleObject( hThread, 5000 ))
    {
        TerminateThread(hThread, 1);    
        wcout << L"Process is Timed Out";
    }
    else
    {
        wcout << L"Process is Ended OK";
    }

    CloseHandle(hThread);   

    wcout << Counter;
}

unsigned int _stdcall DoSomething( void * /*dummy*/ )
{
    while (1)
    {

        ++Counter;

    }
    _endthreadex( 0 );
    return 0;
}
</code>

The Question

The TerminateThread() function is not recommended to call. As I mentioned before, the thread is running inside a dll. If I terminate the thread using TerminateThread() my dll would not unload using FreeLibrary() or even FreeLibraryAndExitThread(). Both functions hangs.

Как прекратить поток и сохранитьFreeLibrary() за работой?

Благодарю.

Возможно, вам стоит взглянуть на размещение Rouge DLL в отдельном процессе и просто убить процесс, если все пойдет в гору? Sam Saffron

Ваш Ответ

1   ответ
13

TerminateThread заставляет поток немедленно завершать работу, даже если он удерживает блокировки или изменяет некоторое внутреннее состояние. TerminateThread может вызвать случайные зависания в вашем приложении (если поток удерживал блокировку) или сбой (если поток изменял какое-то состояние и он оставался несогласованным)

Если вы не можете доверять правильной работе библиотеки DLL, и это вызывает у вас значительные проблемы с надежностью, вам следует переместить код, вызывающий библиотеку DLL, в отдельный процесс - завершение процесса намного безопаснее.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededapplication-levelError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Mar

Похожие вопросы