2013-06-14 6 views
1

스레드 항목 기능을 종료 할 때 함께 스레드 개체를 삭제하고 싶습니다. 쓰레드 함수를 시작하고 쓰레드 객체 인스턴스를 소유하고있는 객체에 공유 포인터를 건네 주면 쓰레드 함수가 종료 될 때 동시에이 객체를 쓰레드 객체와 함께 파괴합니다.스레드 개체 수명 및 스레드 수명 늘리기

편집 : 어쩌면 내가 왜 그렇게하고 싶은지 설명 할 것입니다. 낮은 수준의 dbus API를 사용해야합니다. 내가 원하는 것은 자체 스레드를 시작하고 DISCONNECT 메시지가 도착할 때까지 들어오는 메시지를 기다리는 어댑터 클래스를 작성하는 것입니다. 도착하면 스레드를 닫고 어댑터 자체를 종료하고 싶습니다. 어댑터는 활성 오브젝트이며 스케줄러에 전송 된 메소드를 실행합니다. 이 메소드는 dbus에서 메시지를 읽은 후 다시 스케줄러 큐에 놓입니다. 그러나 DISCONNECT 메시지 인 경우 메소드를 전송하지 말고 스케줄러 스레드를 종료하여 Adapter 객체를 파괴해야합니다. 흠 ... 너무 복잡해 보이는군요 ...

+0

아이디어의 더 간단한 버전 인 http : // stackoverflow가 유효해야합니다.co.kr/a/3974471/2183287 –

+0

왜 boost :: thread 객체가 살아 있어야합니까? 스레드의 죽음은 외부 코드에 대해 예측할 수 없으므로 스레드 개체의 수명이 예측할 수 없으므로 효과적으로 쓸모 없게됩니다. 그리고 스레드는 자신의 std :: thread 오브젝트에 액세스해서는 안됩니다. 쓰래드에서 단순히'detach()'하는 것을 고려 했습니까? –

+0

아래의 답변을 살펴보면 모니터 할 방법이없는 스레드를 분리하는 것은 좋은 생각이 아닙니다. – user2301299

답변

2

the Boost.Thread documentation에서 조인 할 수있는 스레드 객체를 삭제해서는 안되며, 그렇지 않으면 std::terminate이 호출됩니다.

스레드가 joinable이면 thread를 소유 한 객체의 소멸자에서 join() 또는 detach()을 호출해야합니다. 참고 : 스레드 자체가 객체를 파괴하는 경우 join()은 옵션이 아닙니다. 스레드가 자신을 조인하려고 시도하여 교착 상태가 발생합니다.

그러나 이러한 제한 사항을 염두에두면 자체 스레드에서 스레드를 삭제할 수 있습니다.

+0

내가 스레드 함수 내에서 스레드를 분리 할 수 ​​있다는 것을 의미하며 스레드 개체를 삭제 한 직후입니까? – user2301299

+0

예, 작동해야합니다 –

0

유스 케이스를 해결할 지 모르겠지만이 작업을 수행 할 필요가없는 것처럼 들립니다.

boost :: thread 개체의 수명이 스레드 자체와 반드시 일치하지는 않습니다. 당신이 상관하지 않는다면 스레드를 시작할 수도 있고, detach()를 호출하여 객체가 범위를 벗어나게 될 수도 있다는 것을 의미합니다. 그런 다음 삭제되지만 스레드는 기능이 완료 될 때까지 계속 실행됩니다. 유일한 것은 당신이 그것에 참여할 수 없다는 것입니다. 따라서 스레드가 실행되는 동안 프로그램이 종료되면 충돌이 발생합니다.

이 항목에 신경 쓰는 경우이 경우 삭제하기 전에 개체를 저장하고 join()을 호출하기 때문에 질문이 잘못되었을 수 있습니다.

+0

분리 스레드가 아직 실행중인 경우 프로그램이 중단되는 것은 사실입니까? – user2301299

+0

글쎄, 일반적으로 그렇습니다. 무작위. 스레드가 수행하는 작업과 OS에 따라 약간 다릅니다. 귀하의 경우, 취미를하고 있거나 주위를 어지럽 혀 있다면 그냥 가서 할 수 있습니다. 상업용 등급 SW의 경우이 기능을 사용하지 않습니다. OS가 프로세스를 해체하고, 로컬 변수와 전역 변수를 삭제하고 버려진 스레드가 여전히 액세스하고 있다고 상상해보십시오. 예를 들어 충돌이 발생할 것입니다. 스레드가 sleep() 상태이거나 1 + 1을 추가하면 빠져 나갈 수 있습니다 ;-)하지만 그래, 악마 야. –

+0

누군가가 전역 변수를 사용하고 있다고 가정하면 ... 좋은 생각이 아닙니다. OK 스레드 메서드 내에서 정의 된 자체 변수 만 액세스하므로 분리 된 스레드는 아무 것도 잘못 수행 할 수 없습니까? – user2301299

1

이렇게 할 수는 있지만 그렇지 않아야합니다.

boost::thread 개체의 주 목적은 연결된 스레드를 모니터링 할 수 있다는 것입니다. 스레드 모니터 자체가 대부분의 시나리오에서는 그다지 이해가되지 않습니다.

다른 답변에서 제안한 것처럼 detach 스레드를 방치하고 boost::thread 개체를 버릴 수 있습니다. 이렇게하는 것은 일반적으로 모니터링 책임이 다른 객체로 이전되지 않는 한 나쁜 스타일로 간주됩니다. 예를 들어 많은 단순 작업자 스레드는 완료시 미래를 설정합니다. 미래에는 이미 필요한 모든 모니터링이 제공되므로 스레드를 분리 할 수 ​​있습니다.

모든 모니터링 수단을 잃어 버리지 않도록 스레드를 완전히 분리하지 마십시오. 적어도 완전 종료를 보장 할 수 있어야하며, 완전히 분리하지 않으면 가장 사소한 스레드를 제외한 모든 스레드에서 불가능하게됩니다.

+0

미래가 어떻게 스레드를 모니터할까요? 작업자 스레드의 응답을 기다리는 것만으로도 의미가 있습니까? 모든 작업자 스레드가 완료 될 때까지 프로그램을 차단하도록 할 것입니다. – user2301299

+0

바로. 사소한 작업자 스레드의 경우에는 종종 필요한 모든 모니터링이 필요합니다 (예 : [std :: async] (http://en.cppreference.com/w/cpp/thread/async) 참조). – ComicSansMS