2017-10-05 7 views
2

....왜 코드가 스레드 유출을 방해합니까? 나는 리눅스에서이 코드를 실행하고 <code>top</code>로 메모리 소비를 보면이 그렇게 잠시 나를 참아주세요, 아주 간단한 예입니다

#include <boost/thread/thread.hpp> 
struct foo { 
    boost::thread t; 
    void do_something() { std::cout << "foo\n"; } 

    void thread_fun(){ 
     try { 
      boost::this_thread::sleep(boost::posix_time::seconds(2)); 
      { 
       boost::this_thread::disable_interruption di; 
       do_something(); 
      } 
     } catch (boost::thread_interrupted& e) {} 
    } 
    void interrupt_and_restart() { 
     t.interrupt(); 
     //if (t.joinable()) t.join(); // X 
     t = boost::thread(&foo::thread_fun,this);   
    } 
}; 

int main(){ 
    foo f; 
    for (int i=0;i<1000;i++){ 
     f.interrupt_and_restart(); 
     boost::this_thread::sleep(boost::posix_time::seconds(3)); 
    } 
} 

나는 가상의 지속적인 증가를 참조 메모리 사용 (그리고 내 실제 코드가 어느 시점에서 충돌합니다). 인터럽트 후에 스레드에 참여할 경우에만 메모리 사용이 일정하게 유지됩니다. 왜 그런가요?

+2

모든 스레드는 * 실제 * 스레드 함수의 반환 값을 저장하는 것과 같은 부기 용 메모리가 필요합니다. 쓰레드를'join '하지 않으면, 그 메모리는 결코 회수되지 않을 것이다. –

+0

어떤 이유로 @Someprogrammerdude 스레드가'thread_fun'으로 끝나면 내가 결합했는지 여부에 관계없이 깨끗하게 종료된다는 인상하에있었습니다. 나는 그것이 틀렸다는 것을 이미 알고 있지만 완전히 이해하지 못한다. – user463035818

+0

@Someprogrammerdude offtopic for this questions : 나는 또한이 특별한 스레드 (실제 코드에서 의미하는 것이지만 아주 비슷해 보인다)가 놀랍게도 훨씬 더 많이 사용한다는 것을 관찰했다. 내 시스템에있는 다른 스레드보다 메모리가 크고 내가 알고있는 유일한 차이점은 내가 인터럽트한다는 것입니다.하지만 완전히 다른 질문이 될 것입니다 ... – user463035818

답변

1

스레드에 참여하지 않았습니다.이 때문에 스레드 할당 상태를 추적하는 데 필요한 일부 리소스가 할당되었습니다.

아직 가입되지 않은 스레드는 종료 되었더라도 (예 : 스레드 ID가 여전히 유효 함) 일부 시스템 리소스를 계속 사용합니다. 또한 시스템은 동시에 할당 된 스레드 수에 제한을 부과 할 수 있으며 조인되지 않은 스레드는 그 한도에 포함됩니다. 내 Linux VM에 cat /proc/sys/kernel/threads-max을 사용하면 23207 개의 스레드가 제공됩니다.

부스트의 최신 버전은 조인 가능한 스레드 객체를 파괴 할 때 실제로 충돌해야하지만 이전 버전은 파괴 요청을 기꺼이 준수해야합니다.