2009-08-26 6 views
4

하나는 send() 메서드를 사용하므로 2 개 스레드에 의해 공유 될 수 .NET C# 소켓 동시성

을 System.Net.Sockets.Socket

의 인스턴스를 발행하고 다른는() 메소드를받을입니까?

안전한가요?

음, 스레드로부터 안전 할뿐만 아니라 각 스레드가 동시에 호출 할 수 있도록 보내기/받기 메서드를 비동기로 처리해야합니다.

다른 방법이 있습니까?

도움을 주셔서 감사합니다. 저는 자바에서 경험이 있지만이 것을 만드는 데 어려움을 겪고 있습니다.

답변

6

안전해야합니다. 그렇습니다. Socket 클래스는 MSDN to be fully thread-safe에 의해 인용됩니다.

그러나 좋은 생각인지 나는 모른다. 두 개의 스레드를 사용하여 스스로 힘들게 만들 수도 있습니다. 비동기 버전의 경우 BeginSendBeginReceive을보고 싶을 수 있습니다.이 경우 다중 스레드가 필요하지 않습니다.

+1

먼저 스레드 안전성뿐만 아니라 읽기/쓰기 동시 사용도 염려합니다. 그리고 흠, 좋아, 나 좀 더 물어 보자. 후드에서 이러한 비동기 메서드를 사용하면 asincronicity rigth를 달성하기 위해 다른 스레드를 관리 할 수 ​​있습니까? 그렇다면 begin ...을 호출 할 때마다 새 스레드가 생성됩니까? –

+1

아는 한, 새로운 스레드가 생성되지만 매 호출마다 새로운 스레드는 아닙니다. 나는 확인을 위해 약간의 테스트를했고, 그것은 확실히 그렇게 보입니다. – Thorarin

+0

참조 : D –

2

예, 동시에 두 개의 다른 스레드에서 보내기 및 받기에 액세스하는 것이 안전합니다.

응용 프로그램을 100 개의 활성 소켓으로 확장하려면 스레드를 수동으로 만드는 대신 BeginReceive/BeginSend 메서드를 사용하는 것이 좋습니다. 이렇게하면 장면 뒤에서 마술을 할 수 있으므로 소켓을 처리하기 위해 100 개의 스레드를 생성하지 않아도됩니다. 정확히 플랫폼에 따라 다릅니다. Windows에서는 '고성능'IO 완료 포트를 사용합니다. 리눅스 (모노)에서는 epoll을 사용할 것입니다. 어느 쪽이든, 당신은 결국 좋은 물건 인 액티브 소켓보다 스레드를 적게 사용하게 될 것입니다.

+0

수신/전송 전용 스레드를 사용하면 대기 시간이 길어 지거나 비동기 메서드? –

+1

오픈 소켓이 500 개이고 그 중 하나만 수신 중이라고 가정 해 보겠습니다. Socket.Receive()에서 차단하는 500 개의 스레드를 스핀 업해야합니다. 이제 메서드의 비동기 BeginReceive 버전을 사용했다고 가정합니다. .NET 런타임은 소켓을 OS에 전달하고 "데이터가있을 때 알려주십시오"라고 말합니다.데이터가 있으면 런타임은 스레드 풀에서 스레드를 가져 와서 AsyncCallback을 호출하여 데이터를 처리 할 수 ​​있습니다. 이것은 500 개의 스레드를 컨텍스트 전환하는 것보다 * 많은 * 성능이 우수합니다. – Alan

2

제한된 클라이언트가있는 경우에만 주제는 거의 나오지 않지만 동기화 방법을 사용하면 유용합니다. 비동기 소켓이 응답 속도가 느리다는 것을 알았습니다. 비동기 소켓은 많은 클라이언트를 다루는 것이 훨씬 좋습니다.

그래서 : 동기화가 더 빠릅니다. 비동기 확장 성이 더 우수합니다.