Вопрос по c++, windows, multithreading – Убить бегущую нить

4

Что произойдет, если мы принудительно уничтожим работающий поток

У меня есть нить а именноRecordThread() который вызывает некоторые сложные и трудоемкие функции. В этих функциях я используюtry-catch блоки, выделение и освобождение памяти, использование критических переменных раздела и т. д.

лайк

  void RecordThread()
  {
    AddRecord();
    FindRecord();
    DeleteRecord();
    // ...
    ExitThread(0);
   } 

После создания этого потока я немедленно убиваю его, прежде чем поток завершит свое выполнение. В этом случае, что произойдет, если поток будет принудительно уничтожен? Делать внутренние функции (AddRecord, DeleteRecord) завершить их выполнение после того, как мы убили поток?

Ваш Ответ

4   ответа
0

пример Thread, который хорошо работает:

definition in *.h ------------------------------------

DWORD WINAPI Th_EspectroIF(LPVOID lpData);

CThread th_espectro(Th_EspectroIF);

use in *.cc -----------------------------------

DWORD WINAPI Th_EspectroIF(LPVOID lpData)
{

//Your code...

th_espectro.Stop(true);//stop this Thread 

}

вызвать тему с:th_espectro.Start();

Error: User Rate Limit Exceeded
2

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682659%28v=vs.85%29.aspx

ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.

Однако вызовы функций, разумеется, будут завершены, поскольку они вызываются до ExitThread ().

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Уничтожение потока является последним средством - поскольку Андре заявил, что он оставляет данные в неизвестном состоянии, вы никогда не должны этого делать, если поток работает с общим объектом. Лучший выбор - уведомить нить о завершении работы:

использование глобальныхvolatile (важная) переменная, которая изменяется только основным потоком и проверяется работниками
-с помощьюsignal объекты синхронизации типов (в основном события) также устанавливаются основным потоком и проверяются работниками

13

After creating this thread, I am immediately killing it before the thread completes its execution.

Я полагаю, вы имеете в виду, что вы используетеTerminateThread() следующим образом:

HANDLE thread = CreateThread(...);

// ...
// short pause or other action?
// ...

TerminateThread(thread, 0); // Dangerous source of errors!
CloseHandle(thread);

Если это так, то нет, поток выполняетRecordThread() будет остановлен именно там, где он находится во время вызова другого потокаTerminateThread(), Согласно примечаниям вTerminateThread() документация, эта точная точка зрения несколько случайна и зависит от сложных проблем синхронизации, которые находятся вне вашего контроля. Это подразумевает, что вы не можете выполнять надлежащую очистку внутри потока и, таким образом,Вы должны редко, если когда-либо, убивать нить.

Правильный способ запросить поток - это использоватьWaitForSingleObject() вот так:

HANDLE thread = CreateThread(...);

// ...
// some other action?
// ...

// you can pass a short timeout instead and kill the thread if it hasn't
// completed when the timeout expires.
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);
Error: User Rate Limit ExceededTerminateThreadError: User Rate Limit Exceededi++Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

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