2012-06-26 4 views
3

단일 넌 블로킹 소켓을 사용하여 여러 대상에 udp 패킷을 보내고 동일한 소켓에서 모든 응답을 수신합니다. 나는 전용 스레드에서 읽고 있지만 쓰기 (sendto)는 여러 스레드에서 올 수 있습니다.여러 스레드를 사용하여 보내는 Linux 소켓

추가 동기화가 필요없는 안전한가요? 뮤텍스를 가지고있는 동안 쓰는 것이 필요합니까? 또는 쓰레드가 동일한 쓰레드에서 올 필요가 있으며 큐가 필요합니까?

+0

가능한 복제본 : http://stackoverflow.com/questions/1981372/are-parallel-calls-to-send-recv-on-the-same-socket-valid – Casper

+0

다음 주제에 대한 토론도 있습니다. https : //groups.google.com/forum/?fromgroups#!topic/comp.os.linux.networking/cLbMGRNw8EA – Casper

+0

@Casper Google 그룹에 대한 좋은 링크 –

답변

6

커널은 기본 파일 디스크립터에 대한 액세스를 동기화하므로 별도의 뮤텍스가 필요하지 않습니다. TCP를 사용했다면이 방법에 문제가있을 수 있지만, UDP에 관해서 말하고 있기 때문에 이것은 반드시 안전해야합니다 (반드시 최선의 방법은 아님).

+0

@ Nicolai이 응용 프로그램에는 패킷을 보낼 필요성을 감지하는 여러 작업자 스레드가 있습니다. 이 방법이 반드시 가장 좋은 방법은 아니라는 의견에 대해 궁금한 점이 있습니까? 그 이유는 무엇입니까? –

+0

그 모두는 당면 응용 프로그램에 달려 있지만 일반적으로 udp 서버는 비 차단 소켓을 사용하여 훨씬 쉽고 깨끗하게 * 반복적으로 수행됩니다. –

+1

@NY UPTOWN : 다른 쓰레드 레이스에서 여러 개의 sendto()를 사용하는 것이 좋지만'sendto()'가'close()'와 경쟁하지 않도록해야합니다. – caf

-1

단일 스레드 또는 다중 스레드에서 소켓에 쓸 수 있습니다. 여러 스레드에서 소켓에 쓰는 경우 뮤텍스와 동기화해야합니다. 대신 스레드가 메시지를 대기열에 넣고 단일 스레드가 대기열에서 끌어와 쓰기를 수행하는 경우 대기열에서 읽고 쓰는 것은 뮤텍스로 보호되어야합니다.

다른 스레드에서 동일한 소켓을 읽고 쓰는 것이 서로 방해하지 않습니다.

+0

뮤텍스가 요청을 직렬화하는 것은 사실이지만 차이점은 쓰기가 제작자/소비자 스타일 대기열을 사용하는 동일한 스레드와 다른 스레드에서 가져온 것입니다. –

+0

오른쪽. 내 대답을 명확하게 업데이트했습니다. –

관련 문제