self.sender.take()새 작업 제출 경로 제거우아한 종료와 정리
풀을 버릴 때 송신자를 먼저 닫아야 대기 중인 워커가 종료 신호를 받고,
각 JoinHandle을 회수해 실행 중인 작업까지 안전하게
마칠 수 있습니다.
ThreadPool이 drop될 때 sender를 먼저 닫고, recv 대기 중인 worker가 루프를 빠져나온 뒤 JoinHandle::join으로 끝까지 기다리는 흐름입니다.
drop(sender)마지막 송신자 소멸recv() → Err루프를 빠져나옴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<()>>