2010-12-21 2 views
1

동일한 이미 stablished 연결을 사용하여 TCP 메시지를 보내야하는 두 개의 스레드가 있습니다. 부스 스레드에서 사용하고자하는 객체를 tcpSender라고 말합니다. 동시성 문제와 메시지 손실을 방지하기 위해 소프트웨어를 어떻게 디자인 할 수 있습니까?두 개의 서로 다른 스레드에서 TCP 메시지를 보냅니다.

감사합니다.

답변

2

각 스레드가 메시지를 준비 할 때마다 TCPSender에 메시지를 삽입하고 TCPSender이 메시지의 FIFO 큐를 유지할 때 생산자/소비자로 모델링 할 수 있습니다. 대기열에 대한 삽입은 잠기고 (TCPSender 내에 있음) 순서대로 처리됩니다.

메시지가 대기열에서 제거 될 때마다 대기열이 비어 있지 않을 때 의 메시지를 소비하는 이라는 또 다른 스레드가 있습니다.

두 가지 즉각적인 이점은 임의의 수의 생산자를 지원할 수 있으며 차단은 대기열에 삽입하는 것만 가능하며 실제로 생산자의 관점에서 보면 메시지를 보내지 않는 것입니다.

+0

오래 전에이 방법을 사용했습니다. 그것은 아주 잘 작동했습니다. – monoceres

2

각 보낼 때마다 acquireSemaphore을 만들고 각 보낼 때마다 release을 만들 수 있습니다. 이렇게하면 한 번에 하나의 스레드가 리소스에 액세스 할 수 있습니다.

+0

+1 예. 보내기 작업이 임의로 오랫동안 차단 될 수 있습니다 (예를 들어, 연결의 다른 쪽 끝에서 데이터 수락이 중단되고 TCP 흐름 제어가 시작되는 경우), '가져 오기'를 오래 기다릴 수 있습니다. 신호기. –

+0

불필요하게 복잡합니다. 세마포어는 대개 Java의 경우 동시 액세스의 특정 수를 제한하려는 경우에만 필요합니다. 하나의 스레드 만 리소스에 액세스 할 수있는 경우 동기화 된 블록을 사용하는 것이 훨씬 쉽습니다. – jarnbjo

+0

하지만 개체가 차단되는 동안 하나의 스레드가 보내야 할 경우 어떻게됩니까? – biquillo

1

이 데이터를 보낸 후에 답을 얻을 필요가없는 경우 대기열을 사용할 수 있습니다.

관련 문제