유닉스에서 C를 사용하여 TCP/IP 연결을 사용하는 여러 클라이언트에 연결하는 서버가 있습니다. 한 번에 20 개가 넘는 연결이 없으므로 연결/소켓 당 스레드를 사용할 것이라고 생각했습니다. 그러나 문제는 사용자에게 메시지를 보내는 메시지를 클라이언트에 보낼 때 소켓에 쓰는 것입니다. 각 소켓이 스레드에 의해 처리되면 소켓에 쓰기 위해 작성된 스레드와 어떻게 상호 작용합니까? 각각의 스레드가 소켓에서 읽어야하고 주 프로그램의 소켓에 쓰여야합니까? 그게 좋은 방법인지 확실하지 않습니다.소켓/TCP 연결 용 멀티 스레딩에 대한 질문
답변
내 규칙에 따르면 특정 소켓은 단일 스레드 (*)로만 작동해야합니다. 따라서 각 소켓에 대해 별도의 I/O 스레드를 생성하고 주 스레드가 I/O 스레드 소켓에 작성된 것을 원할 경우 주 스레드는 해당 데이터를 I/O 스레드로 보내야합니다. 그러면 I/O 스레드 그것을 소켓에 쓸 수 있습니다.
물론 이것은 메인 스레드와 I/O 스레드 사이에 좋은 통신 방법이 필요하다는 것을 의미합니다. 이 작업은 각 I/O 스레드에 대해 소켓 쌍을 생성하고 소켓 쌍 끝에있는 I/O 스레드 select()/poll()을 사용하여 수행 할 수 있습니다 (메인 스레드에서 오는 데이터를 처리하기 위해). 네트워크 소켓 에서처럼.
하지만 일단 그렇게하면 select()/poll() 및 멀티 스레드를 사용하는 복잡성을 처리하게됩니다. 이는 많은 복잡성 오버 헤드입니다. 어떤 이유로 다중 스레드가 절대적으로 필요하지 않으면 이전 포스터에 동의합니다. select() 또는 poll()을 통해 단일 스레드에서 모든 소켓을 처리하는 것이 좋습니다.
(*) 같은 소켓에 동시에 여러 스레드에서 읽고 쓰는 것이 가능하지만 오류가 발생하기 쉽습니다. 특히, 시작 및 종료 시퀀스는 100 % 올바르게 수행하는 것이 까다로울 수 있습니다. 그래서 여러 스레드 사이에서 주어진 소켓을 '공유'하는 것을 피하려고합니다.
단일 스레드로 소켓을 멀티플렉싱하는 것이 좋습니다 (예 : 선택, 폴링 등). 이렇게하면 경쟁 조건과 잠금 요구 사항을 피할 수 있습니다. 그렇지 않으면 프로그램 작성이 어려워집니다.
중요한 프로세서 집약적 인 작업을 수행하거나 이러한 클라이언트를 대신하여 IO를 기다리지 않는 한 스레드를 사용하면 아무런 이점도 없지만 경쟁 조건은 그대로 유지됩니다.
그래서 내가 말하고 싶은데요, 단일 스레드를 사용하여 작업 구현을 얻었습니까? 성능 테스트에서 부족하다는 것을 발견하면 리팩토링하여 성능 문제를 극복하는 최상의 옵션 인 것처럼 보입니다. 물론 그것을 프로파일 링하는 등).
- 1. 멀티 스레딩에 대한 기본 질문
- 2. 디버깅, 멀티 스레딩에 관한 면접 질문
- 3. iOS에서 멀티 스레딩에 대한 도움이 필요하십니까?
- 4. 멀티 캐스트에 대한 질문
- 5. 멀티 스레딩에 대해 C 언어로 알려주십시오. #
- 6. RFID를 이용한 C# 스레딩에 관한 질문
- 7. .net의 비동기 프로그래밍, 스레딩에 관한 질문
- 8. 멀티 스레딩에 초점을 맞춘 스칼라 튜토리얼을 찾으려는 시도
- 9. 대량 배치 프로세스에 대한 멀티 스레딩 질문
- 10. 멀티 프로브에 대한 질문 로컬 민감한 해싱
- 11. 멀티 스레딩 및 EntityManager에 대한 질문
- 12. 스레딩에 대한 몇 가지 개념적 문제
- 13. 초급 멀티 참여 질문
- 14. java - 멀티 플레이 연결
- 15. iPhone "멀티 스레딩"질문
- 16. 멀티 스레딩 질문
- 17. 멀티 터치 질문
- 18. 멀티 스레딩 질문
- 19. 멀티 터치에 관한 질문
- 20. WCF PeerChannel 연결 제어에 대한 질문
- 21. 질문 연결
- 22. 멀티 스레드 및 데이터베이스 연결
- 23. iPhone 용 Facebook SDK에 대한 질문
- 24. 레일 용 클립 클립에 대한 질문
- 25. Android 용 서명 애플리케이션에 대한 질문
- 26. NLP 초보자 용, 특수 효과에 대한 질문
- 27. Google 코드 용 Google Analytics에 대한 질문
- 28. 데이터 조회 용 상수에 대한 질문
- 29. Ruby에 대한 매우 낮은 수준의 질문 및 라이브러리에 대한 연결
- 30. 멀티 프로세싱과 트위스트를 비교하는 질문