우아한 종료와 정리

풀을 버릴 때 송신자를 먼저 닫아야 대기 중인 워커가 종료 신호를 받고, 각 JoinHandle을 회수해 실행 중인 작업까지 안전하게 마칠 수 있습니다.

ThreadPool이 drop될 때 sender를 먼저 닫고, recv 대기 중인 worker가 루프를 빠져나온 뒤 JoinHandle::join으로 끝까지 기다리는 흐름입니다.

1 · sender 회수self.sender.take()새 작업 제출 경로 제거
2 · 채널 닫힘drop(sender)마지막 송신자 소멸
3 · 워커 종료recv() → Err루프를 빠져나옴
4 · 완료 대기thread.take().join()모든 스레드 종료 확인
1

sender 소유권을 Option으로 감싸기

mpsc::Sender<Job>을 Option에 넣어 Drop에서 take()로 채널을 닫을 수 있게 합니다.

Option<Sender<Job>>
2

worker 루프가 recv 오류를 감지

sender가 drop되면 receiver.recv()가 Err를 반환하고 worker는 loop를 break합니다.

recv() Err => shutdown
3

JoinHandle을 take 후 join

Worker의 thread 필드도 Option으로 두면 소유권을 꺼내 join()하고, 실행 중인 작업이 끝날 때까지 main thread가 기다립니다.

Option<JoinHandle<()>>