Я работаю над многопоточной системой, вот мой код
демонстрация класса определена в файле .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");
}
}
Нет — закрытие дескриптора потока не уничтожает сам поток. Нить должна выход (либо по телефону ExitThread
или просто вернувшись из функции потока), когда она закончит свою работу.
В экстренных случаях вы Можно использование TerminateThread
чтобы убить поток, но это должно быть зарезервировано для настоящих чрезвычайных ситуаций — он может оставить процесс в нестабильном состоянии, поэтому его вообще следует избегать, и если вам придется его использовать, вы, вероятно, захотите завершить процесс как можно скорее потом, насколько это возможно.
Также обратите внимание, что в программе, использующей стандартную библиотеку, использование на самом деле небезопасно CreateThread
напрямую — звоните _beginthread
или же _beginthreadex
вместо. Они делают некоторую настройку, чтобы позволить поточно-ориентированное использование стандартных библиотечных функций, которые используют статическое хранилище (например, strtok
а также mktime
, но есть еще немало).
Отбросьте все эти «(type) foo», они заставляют компилятор принимать вещи, которые в действительности не подходят. Там вам придется исправить несколько ошибок, заменив их на нужный тип. Для указателя контекста, переданного потоку, преобразование из demo*
в void*
неявно. Правильный бросок, чтобы полностью изменить это static_cast<demo*>(data)
, Если вы хотите, вы можете использовать статическое приведение также для неявного преобразования. В функциях также отсутствуют возвращаемые значения, единственный допустимый случай — в main (). Причина, о которой я упоминаю, заключается в том, что формально в вашей программе может произойти все что угодно, потому что эти вещи вызывают неопределенное поведение.
Затем вы выводите «значение inst», но фактически выводите адрес локальных переменных, называемых «inst», который является чем-то другим. Это, вероятно, только добавляет к вашей путанице.
Теперь, переходя к вашей проблеме, CloseHandle () не останавливает поток. Это только освобождает вашу ручку. То, что вы хотите, это WaitForSingleObject () или один из его братьев вместо этого.