2010-03-20 6 views
2

유닉스에서 C를 사용하여 TCP/IP 연결을 사용하는 여러 클라이언트에 연결하는 서버가 있습니다. 한 번에 20 개가 넘는 연결이 없으므로 연결/소켓 당 스레드를 사용할 것이라고 생각했습니다. 그러나 문제는 사용자에게 메시지를 보내는 메시지를 클라이언트에 보낼 때 소켓에 쓰는 것입니다. 각 소켓이 스레드에 의해 처리되면 소켓에 쓰기 위해 작성된 스레드와 어떻게 상호 작용합니까? 각각의 스레드가 소켓에서 읽어야하고 주 프로그램의 소켓에 쓰여야합니까? 그게 좋은 방법인지 확실하지 않습니다.소켓/TCP 연결 용 멀티 스레딩에 대한 질문

답변

2

내 규칙에 따르면 특정 소켓은 단일 스레드 (*)로만 작동해야합니다. 따라서 각 소켓에 대해 별도의 I/O 스레드를 생성하고 주 스레드가 I/O 스레드 소켓에 작성된 것을 원할 경우 주 스레드는 해당 데이터를 I/O 스레드로 보내야합니다. 그러면 I/O 스레드 그것을 소켓에 쓸 수 있습니다.

물론 이것은 메인 스레드와 I/O 스레드 사이에 좋은 통신 방법이 필요하다는 것을 의미합니다. 이 작업은 각 I/O 스레드에 대해 소켓 쌍을 생성하고 소켓 쌍 끝에있는 I/O 스레드 select()/poll()을 사용하여 수행 할 수 있습니다 (메인 스레드에서 오는 데이터를 처리하기 위해). 네트워크 소켓 에서처럼.

하지만 일단 그렇게하면 select()/poll() 및 멀티 스레드를 사용하는 복잡성을 처리하게됩니다. 이는 많은 복잡성 오버 헤드입니다. 어떤 이유로 다중 스레드가 절대적으로 필요하지 않으면 이전 포스터에 동의합니다. select() 또는 poll()을 통해 단일 스레드에서 모든 소켓을 처리하는 것이 좋습니다.

(*) 같은 소켓에 동시에 여러 스레드에서 읽고 쓰는 것이 가능하지만 오류가 발생하기 쉽습니다. 특히, 시작 및 종료 시퀀스는 100 % 올바르게 수행하는 것이 까다로울 수 있습니다. 그래서 여러 스레드 사이에서 주어진 소켓을 '공유'하는 것을 피하려고합니다.

2

단일 스레드로 소켓을 멀티플렉싱하는 것이 좋습니다 (예 : 선택, 폴링 등). 이렇게하면 경쟁 조건과 잠금 요구 사항을 피할 수 있습니다. 그렇지 않으면 프로그램 작성이 어려워집니다.

중요한 프로세서 집약적 인 작업을 수행하거나 이러한 클라이언트를 대신하여 IO를 기다리지 않는 한 스레드를 사용하면 아무런 이점도 없지만 경쟁 조건은 그대로 유지됩니다.

그래서 내가 말하고 싶은데요, 단일 스레드를 사용하여 작업 구현을 얻었습니까? 성능 테스트에서 부족하다는 것을 발견하면 리팩토링하여 성능 문제를 극복하는 최상의 옵션 인 것처럼 보입니다. 물론 그것을 프로파일 링하는 등).

1

소켓에 대한 주 스레드 쓰는 것이 좋으면 동시에 여러 스레드가 소켓에 쓰는 것에 대해 걱정할 필요가 있습니다.

그러나 단일 스레드와 select/poll의 성능을 테스트하기 전에 muti 스레드 방식을 사용하는 것이 좋습니다.

관련 문제