Нить не уничтожается

Я работаю над многопоточной системой, вот мой код
демонстрация класса определена в файле .h

когда цикл из главной функции выполняется во второй раз, COMMENT1 ниже принимает предыдущее значение

не закрывающая ручка закрывает поток?

int threadentry(void* data)
{
demo* inst=(demo*) data;
cout << "Value of inst  "<<hex << &inst<< endl;
string request;
cin>>request;
if(request==play)
{
inst->play;
cout << "Value of inst  "<<hex << &inst<< endl;
// COMMENT1 here when the thread is executed second time from the main it is taking previous value
}
}

int main()
{
while(1)
{
demo* inst=new demo();
cout << "Value of inst  "<<hex << &inst<< endl;  //value is coming different from above
HANDLE threads;
DWORD threadId1;
if ((threads = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadentry,
(void *)inst, 0, &threadId1)) == NULL)
return -1;
//here is some Processing of data and after processing I close the handle
CloseHandle(threads);
delete inst;
system("pause");
}
}

1

Решение

Нет — закрытие дескриптора потока не уничтожает сам поток. Нить должна выход (либо по телефону ExitThread или просто вернувшись из функции потока), когда она закончит свою работу.

В экстренных случаях вы Можно использование TerminateThread чтобы убить поток, но это должно быть зарезервировано для настоящих чрезвычайных ситуаций — он может оставить процесс в нестабильном состоянии, поэтому его вообще следует избегать, и если вам придется его использовать, вы, вероятно, захотите завершить процесс как можно скорее потом, насколько это возможно.

Также обратите внимание, что в программе, использующей стандартную библиотеку, использование на самом деле небезопасно CreateThread напрямую — звоните _beginthread или же _beginthreadex вместо. Они делают некоторую настройку, чтобы позволить поточно-ориентированное использование стандартных библиотечных функций, которые используют статическое хранилище (например, strtok а также mktime, но есть еще немало).

2

Другие решения

Отбросьте все эти «(type) foo», они заставляют компилятор принимать вещи, которые в действительности не подходят. Там вам придется исправить несколько ошибок, заменив их на нужный тип. Для указателя контекста, переданного потоку, преобразование из demo* в void* неявно. Правильный бросок, чтобы полностью изменить это static_cast<demo*>(data), Если вы хотите, вы можете использовать статическое приведение также для неявного преобразования. В функциях также отсутствуют возвращаемые значения, единственный допустимый случай — в main (). Причина, о которой я упоминаю, заключается в том, что формально в вашей программе может произойти все что угодно, потому что эти вещи вызывают неопределенное поведение.

Затем вы выводите «значение inst», но фактически выводите адрес локальных переменных, называемых «inst», который является чем-то другим. Это, вероятно, только добавляет к вашей путанице.

Теперь, переходя к вашей проблеме, CloseHandle () не останавливает поток. Это только освобождает вашу ручку. То, что вы хотите, это WaitForSingleObject () или один из его братьев вместо этого.

2

По вопросам рекламы [email protected]