1

내가 여기에 내 코드 클래스 데모가 .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"); 
    } 
} 
+0

std :: thread를 보셨습니까? – kfsone

답변

2

아니요 - 스레드 핸들을 닫아도 스레드 자체가 삭제되지 않습니다. 스레드가 (ExitThread으로 전화하거나 스레드 기능에서 돌아 오는 중 하나)을 끝내야합니다. 당신이있는 경우가 불안정한 상태 과정을 남길 수 있으므로 일반적으로 피해야한다,와 - 비상 사태에

, 당신은 사용 TerminateThread 스레드를 죽이고,하지만 그건 사실이 비상 사태에 예약해야한다 그것을 사용하면 가능한 한 빨리 프로세스를 종료하고 싶을 것입니다.

표준 라이브러리를 사용하는 프로그램에서는 CreateThread을 직접 사용하는 것이 안전하지 않으므로 _beginthread 또는 _beginthreadex을 대신 호출해야합니다. 이는 정적 저장소를 사용하는 표준 라이브러리 함수 (예 : strtokmktime)의 스레드 안전 사용을 허용하기위한 몇 가지 설정을 수행하지만 그 중 몇 가지가 더 있습니다.

+0

최대한 빨리 스레드를 닫으려고합니다. 핸들을 닫으십시오. 여기에서 TerminateThread를 사용할 수 있습니까? 이 경우 메모리 누수가 발생할 위험이 있습니까? – Euler

+1

스레드를 실행 하시겠습니까? 실행하지 않으려면 시작하지 마십시오. 실행하려면 실행이 완료되도록하십시오. 예, 당신은 * 시작할 수 있습니다. 그리고 나서 즉시 종료 할 수 있습니다 -하지만 그렇게하는 것은 말이되지 않습니다. –

2

"(유형) foo"캐스트를 모두 버리면 실제로 컴파일러가 적합하지 않은 사항을 컴파일러에서 받아들이게됩니다. 적절한 유형으로 사물을 대체하여 몇 가지 오류를 수정해야합니다. 스레드에 전달 된 컨텍스트 포인터의 경우 demo*에서 void*으로의 변환이 암시 적입니다. 이 반대의 올바른 캐스트는 static_cast<demo*>(data)입니다. 원하는 경우 암시 적 변환을 위해 정적 캐스트를 사용할 수도 있습니다. 함수에서 반환 값이 누락 되어도 허용되는 유일한 경우는 main()에 있습니다. 내가 언급 한 이유는 공식적으로 프로그램에서 어떤 것도 일어날 수 있습니다. 왜냐하면 이러한 것들이 정의되지 않은 동작을하기 때문입니다.

그런 다음 "value of inst"를 출력하지만 "inst"라는 로컬 변수의 주소를 실제로 출력합니다. 이것은 다른 것입니다. 이것은 아마 당신의 혼란에 추가됩니다.

이제 문제가 발생하면 CloseHandle()은 스레드를 중지하지 않습니다. 네 손잡이 만 놓는다. 원하는 것은 WaitForSingleObject() 또는 그 형제 중 하나입니다.

+0

그래, 내가 원하는 어드레싱 문제에 동의한다. << "값"<< hex << inst << endl; 또는 cout << "값"<< hex << * inst << endl; – madnut

+0

실수를 지적 해 주셔서 감사합니다 (내가 closeHandle을 호출하는 곳)의 주 기능에서 스레드를 종료하려면 스레드를 종료 할 수 있습니까? – Euler

+1

웹에서 "스레드 취소"를 검색하면 강제 종료가 공유 데이터 상태와 관련하여 여러 가지 위험을 감수해야합니다. 실제로 무엇을하고 있는지 알지 못하고 스레드에서 코드를 취소 가능으로 작성하지 않는 한 그렇게하지 마십시오. 아직 거기에 없으므로 스레드에게 종료 및 대기, 또는 백그라운드에서 실행되도록 남겨 두십시오.프로그램 종료시, 다른 스레드가 걱정되는 경우에 대비하여 어쨌든 취소됩니다. –