2011-07-04 2 views
1

나는 엄청나게 많은 봤 거든이 답변을 찾을 수 없습니다. 내 자신의 작은 Tcp 라이브러리를 쉽게 프로그래밍 할 수 있도록 프로그래밍하고 있습니다. 서버에는 소켓과 네트워크 스트림이있는 'ConnectedClient'개체가 있습니다. 서버 정적 클래스에 길이가 접두사가 붙은 스트림을 보내는 Send 함수가 있습니다. 스트림을 스레드로부터 보호하기를 원하지만 각 클라이언트에 대해. 그게 효과가 있니?ParameterInstance.lockObject에 의한 스레드 잠금, 작동합니까?

Send(ConnectedClient client, ...(rest of parameters nor relevant)) 
{ 
lock (client.lockObject) 
{ 
// Writing to stream thread-safely I hope... 
} 
} 

나는 분명히 나 자신을 분명하게 만들었 으면 좋겠다.

+0

"... 쉽게 만들 수 있습니다 ..."미리 만들어진 라이브러리를 사용하는 것이 더 쉽지 않을까요? – dlev

+0

@dlev while * true *, 우리 모두 ***가 미리 만들어진 것을 사용하기를 기다린다면 아무 것도 사용하지 않을 것입니다; p –

+0

사실입니다. 나는 이것이 뭔가를 배우기위한 것이 었음을 진술 했어야했다. –

답변

1

어떤 멀티플렉서를 쓰고있는 것처럼 보입니다. 사실 lock 하나의 전체 페이로드 (및 길이 접두사)를 작성하고 lockObject이 상호 배타적 인 자원을 대표하는 한 (즉, 모든 클라이언트에 대해 공통이어야합니다. 우리는 충돌하고 싶지 않다).

는 아마도 난이도 질문입니다 : 그 방법 내에서 응답을 읽을려고하고있다 (성공/반환 값/임계 실패), 또는 비동기 응답을 읽으려고하고, 다음 작가 쓰기를 할 수 첫 번째 메시지가 전송되는 동안 스트림으로 ...

BookSleeve (redis 멀티플렉서, 일부 소스 코드를 원할 경우 전체 소스를 사용할 수 있음)을 작성할 때 나는 다른 전략을 선택했습니다. 모든 호출자가 스레드 안전 대기열에 단순히 추가하는 쓰레드에 쓰는 것. 그런 식으로, 업무의 백 로그가 있더라도, 발신자는 지연되지 않습니다.

+0

나는 보낼 때 쓸 수있는 memorystream을 가진 패킷 클래스를 가지고 있고, 입력시 큐에 겹쳐 쌓인 바이트와 스트림에 lodaded 된 byte []가있다. 메시지의 종류를 쉽게 식별 할 수있는 길이와 바이트. 다음 모든 (recv