Кому принадлежит CWinThread после того, как он был создан AfxBeginThread? - PullRequest
6 голосов
/ 15 марта 2012

Я запускаю тему, используя AfxBeginThread.Это возвращает указатель на новый CWinThread объект.

MSDN заявляет, что этот указатель равен NULL, и он освободит все, если создание потока завершится неудачно.Однако, как только поток завершается после регулярного запуска, объект CWinThread все еще существует.Я не уверен, следует ли мне удалять объект CWinThread или это делает сам MFC (хотя это не так).

К вашему сведению, маловероятно, что поток завершится, поскольку он должен работатьпока приложение не закончится.Однако, поскольку я использую его как часть пула потоков, я не хочу, чтобы CWinThread навсегда зависал.

Ответы [ 3 ]

9 голосов
/ 14 мая 2015

Ответственность за очистку объекта CWinThread зависит от его значения m_bAutoDelete. По умолчанию это удалить себя. Для огня и забыть короткие бегущие нити это хорошо. Он будет убирать за собой.

Если ваш поток долго работает и ему нужно сообщить, что пора выходить из него или иным образом взаимодействовать с ним, вы захотите, чтобы дескриптор CWinThread оставался действительным и не указывал на самоудаляемый объект.

Если для m_bAutoDelete установлено значение FALSE, вы берете на себя ответственность за его удаление. Чтобы обеспечить безопасность возвращаемого указателя, вы должны создать приостановку и установить для нее значение ЛОЖЬ, прежде чем возобновить работу, как это было предложено Джозефом Ньюкомером в его статье Использование рабочих потоков .

   thread = AfxBeginThread(proc, this, 
                       THREAD_PRIORITY_NORMAL, // default: use it
                       0,     // default stack size 
                       CREATE_SUSPENDED); // let us set auto delete
   if(thread) { // protect against that rare NULL return
       thread->m_bAutoDelete = FALSE;
       thread->ResumeThread();
   }
4 голосов
/ 16 марта 2012

Я никогда не доверял CWinThread для очистки после себя.Я обычно создаю потоки и говорю MFC, что я выполню очистку, особенно когда программа закрывается:

CWinThread *thread = AfxBeginThread(...); 
thread->m_bAutoDelete = FALSE;

Однако вам придется сохранить указатель потока, иначе у вас будет памятьутечки.

2 голосов
/ 15 марта 2012

Если ваш поток все еще работает, вы не должны удалять его. Как только он остановился, просто используйте оператор delete в указателе, возвращенном AfxBeginThread, чтобы освободить память, используемую потоком:

CWinThread *thread = AfxBeginThread(...);
/* ... */
// now wait for it to terminate
WaitForSingleObject(thread->m_hThread, INFINITE); 
delete thread;

Вы должны хранить указатели CWinThread до конца потока / приложения, чтобы вы могли освободить память, выделенную для них. В противном случае у вас будет утечка памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...