2013-04-29 9 views
1

이 질문에 대한 답변입니다 : https://stackoverflow.com/a/14241095/2332808 (댓글을 달았지만 새로 작성한 계정은 분명히 소음으로 인해 유감스럽게 생각할 수 없습니다.) epollet/multithreading의 Ressources는 찾기가 어렵습니다. .)에지 트리거링, 한 샷 및 멀티 스레딩이 포함 된 epoll

그것은 다음과 같은 epoll 파일을 사용하여 제안 :

  1. epoll_ctl() 알림을 활성화 (그리고 EPOLLONESHOT 사용하는 경우 재 활성화).
  2. 시스템 입력 : 까지 read()/recv()/accept() 루프가 반복됩니다.
  3. epoll_wait() 알림을 수신 할 수 있습니다. 같은 epollfd에 epoll_wait()에서 여러 스레드 당신이 읽는을 완료하기 전에 더 많은 데이터를 수신하는 경우 다른 스레드를 가진이 위험 같은 FD에 깨어되지 않는 것, 거기에 가정

하지만, (예를 들면 결말 와 같은 FD를 처리하는 두 개의 스레드)

당신이 주변 상황을 설정하더라도

read()EAGAIN까지, epoll_ctl() 다음 아무것도 아직 없습니다 확인하기 위해 다시 read() 전화 (당신이 마지막으로 읽은 사이에 무엇인가를 받게 할 위치 레이스를 피하고 epoll_ctl()) ...

하지만 내가 가진 같아요 실제로 epoll_ctl() 후 무언가를받지 못했을 것이다 마지막 read() 검사 및 FD 다시 같은 작업을 깨우지 다른 스레드 모두있을 것입니다 보장 ...

은 아직 없다 fd 당 잠금은 수용 가능한 해결책이 될 것이지만 동일한 epollfd에서 다중 스레드 폴링을 사용하는 에지 트리거 모드에서 epoll의 "승인 된"사용입니까?

+0

복잡한 기계로 무엇을 이루고자합니까? 'EPOLLONESHOT'이 어떻게 당신을 도울까요? –

+0

일부 fd에서 활동이있을 때 사용자 콜백이 발생하므로 사용자를 보호하기 위해 여러 스레드를 설정하려고합니다 (예 : 콜백 블록이 하나있는 경우). 나는'EPOLLONESHOT'이 갑작스런 활동 급상승이있을 때 같은 FD에서 여러 작업자 스레드가 깨어나지 않도록 보호 할 것이라고 생각했습니다. – Asmadeus

+0

글쎄, 내가 말할 수있는 것은 기능상의 문제가 없다. 끔찍한 콜백 (모든 것이 모든것을 잠그고있다.)이 더 적은 CPU 사용량으로 인해 성능이 약간 향상된다. 단일 epoll 루프에서 깨어나게 될 작업자 스레드 풀을 가지고있는 것 같아요. (가장자리 나 끝이없는'EPOLLIN '으로 돌아 가면) 더 나은 디자인이 될 것입니다. 그러나 작업자에게 정보를 전달하는 것이 훨씬 쉬워 보이지 않습니다. 나를. – Asmadeus

답변

0

그렇습니다. 설명하는 사례를 막기 위해 여전히 적절한 잠금을 수행해야합니다. fd 당 잠금을 사용하는 것이 가장 현명한 접근 방법입니다.