리눅스에서 두개의 쓰레드가 만들어지고 둘 다 실행 중일 때, 그들 중 하나가 recv()
이나 데이터를 사용할 수 없을 때 블록하는 IO syscall을 호출하면, 전체 프로세스는 어떻게 될까요?하나의 스레드가 차단되면 다른 스레드는 어떻게됩니까?
다른 스레드도 차단됩니까?이 문제는 스레딩이 구현되는 방식에 달려 있다고 생각합니다. 스레드 라이브러리가 사용자 공간에 있고 커널이 프로세스 내의 스레드를 완전히 인식하지 못하면 프로세스가 스케줄링 엔티티이므로 두 스레드가 모두 차단됩니다.
또한, 다른 스레드가이 때문에 차단하지 않으면, 그것을 recv
수있는 스레드를 차단 같은 소켓을 통해 데이터 send()
? 양면 인쇄?
아이디어가 있으십니까?
감사합니다. 상당히 완전한 대답. 좋은 전화. – Figo
스레드가 recv()를 호출하기 전에 소켓에 데이터가 도착하면 스레드가 실제로 해당 데이터를 가져올 수 있습니까? – Figo
예. 이것이 블로킹되지 않는 데이터 그램 소켓에서 작동 할 수있는 유일한 방법입니다. 제가 도움이 될만한 몇 가지 작은 메모들 - 당신은 이런 종류의 것을 꽤 쉽게 실험 할 수 있습니다. 연결을 '수락'할 잠시 후 잠자기 프로그램을 작성한 다음 새 연결에서'recv'를 호출하십시오.'nc' (netcat) 또는 뭔가를 사용하여 서버에 대한 연결을 만들고 즉시 일부 데이터를 작성하십시오. 서버가 보낸 데이터와 동일한 데이터를 얻게됩니다. 두 번째 메모 -이 질문은 일반적으로 한 번에 한 번에 한 번 질문하는 질문에 대한 세 번째 질문입니다. –