2009-11-22 3 views
1

특정 스레드에서 만든 특정 메모리 개체를 정리하려고합니다 (따라서 해당 스레드에서만 액세스 가능). 나를 달성 할 수있는 유일한 방법은 메모리 블록을 해제 할 때 특정 스레드로 전환하는 것입니다. 나는 원래 방식으로 메모리 컨텍스트의 생성과 파괴를 추가 한MFC 응용 프로그램 정리를위한 스레드 전환

alt text http://imagebin.ca/img/DeTe9Z6h.jpg

: http://imagebin.ca/img/S6mwZBFu.jpg

이 내가 할 시도한 것입니다 : 나는 특정 메모리 컨텍스트를 할당하는 방법

입니다 다음과 같이하십시오 :

int Thread2::main() 
{ 
    CudaMemoryContext *theCudaObj = new CudaMemoryContext(); 
    while(!TerminateStatus()) 
    { 
     ... 
    } 
    delete theCudaObj; 
    return 0; 
} 

그러나 ach가 잘 작동하지 않습니다. 즉, "delete theCudaObj;"에서 정리할 때 프로그램이 충돌합니다. 선. 정리할 때 활성 스레드를 전환 할 수 있는지 또는 두 스레드가 액세스 할 수 있도록 CUDA 컨텍스트를 할당 할 수 있는지 궁금합니다. 두 스레드를 통해 쉽게 정리하고 액세스 할 수 있습니다. 제안에 미리 감사드립니다.

+0

다른 스레드에서 삭제하면 충돌을 피할 수 있다는 것을 어떻게 알 수 있습니까? 충돌의 문제가 스레딩과 관련이없는 것처럼 보입니다. –

+0

피할 수 있는지 모르겠습니다. 문제가 적절한 메모리 컨텍스트에서 cuda 메모리 컨텍스트를 삭제할 수있는 것 같습니다. – stanigator

답변

1

스레드 # 1은 스레드 # 2를 어떻게 파괴합니까? 일반적으로 TerminateThread()를 사용하지 않고 스레드 자체를 종료하도록 신호를 보내는 것이 가장 좋습니다.

+0

스레드 # 1의 소멸자가 스레드 # 2의 주 루프에 대한 플래그를 설정하여 스레드 # 2가 종료되도록 요청하고 있습니다. 그래도 스레드를 알리는 가장 좋은 방법은 무엇입니까? 이 목적을 위해 다른 세마포 또는 별도의 사서함을 만드는 중입니까? – stanigator

+0

스레드 # 2의 루프가 어떤 종류의 이벤트를 기다리는 것을 막기를 바랍니다. 그렇지 않으면 불필요하게 CPU 사이클을 씹을 것입니다. 종료하기 전에 Thread1이 신호를 보내는 추가 이벤트를 작성하십시오. 그런 다음 Thread1은 종료하기 전에 WaitForSingleEvent (hThread2)를 호출하여 Thread2가 제대로 종료되도록합니다. – user216305

+0

http://msdn.microsoft.com/en-us/library/ms686915%28VS.85%29.aspx 에 나와있는 예제를 간단히 살펴 보았지만 이것이 가장 쉬운 예가 아닌지 잘 모르겠습니다. 이벤트를 사용하여 진행중인 작업을 파악하십시오. 특정 사례에 대한 권장 사항이 있습니까? – stanigator

0

원래의 접근 방식은 일을 제대로 수행하는 것처럼 보입니다. 스레드가 종료 신호를 보내면 루핑이 중지되고 할당 된 메모리가 정리됩니다.

종료 할 스레드에 신호를 보내면 응용 프로그램을 종료하기 전에 스레드가 종료 될 때까지 기다려야합니다. 조기 이탈로 추락 사고가 발생했을 수 있습니다. 진단을 위해 예외가 발생하면 디버거가 연결되고 중단되도록 설정하여 실행하십시오.