내 프로젝트에 libnetfilter_queue를 사용하고 있습니다. From C app queue는 "queue file descriptor"에 의해 접근 가능합니다. 나는 그들을 처리하기 위해 5 개의 큐와 5 개의 스레드를 가지고있다. 내가 원하는 것은 대기열에 정확하게 2 개의 패킷이있을 때 스레드를 깨우는 것입니다. select 함수와 int 배열을 사용하여 각 큐에 얼마나 많은 패킷이 대기하고 있는지를 알 수있었습니다. 선택> 0 코드로 끝내고 난 후에 어느 큐가 패킷을 받았는지 확인하고 어레이의 값을 증가시킨다. 만약 그것이 2보다 크다면 스레드를 깨운다. 모든 것이 좋겠지 만 select는 recv를 호출 할 때까지 큐에 읽을 데이터가 있음을 나타내므로 별도의 스레드가 이러한 패킷을 처리해야하므로이를 수행 할 수 없습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 내가 SO_RCVLOWAT를 설정할 수 있지만 내 문제를 해결하지 못한다는 것을 알고 있습니다. 왜냐하면 어떤 크기가 2 패킷이 될지 모르기 때문입니다.2 패킷을받은 후 스레드를 깨우는 방법
3
A
답변
3
Tobu에서 권장하는대로 epoll이 더 나은 선택이며 선택보다 성능이 우수합니다. 그러나 대부분의 이러한 폴링 함수는 누군가 읽지 않는 한 이벤트 (사용 가능한 데이터)가 있음을 나타냅니다. 가능한 경우 다음 모델을 사용하십시오. epoll/select를 사용하여 들어오는 데이터가 워킹 스레드를 깨우는 것을보십시오. 작업자 스레드가 실제로 작업을하기 전에 데이터로 수행 할 작업 (하나의 패킷, 둘 이상)을 결정하게하십시오.
OR : 리더 스레드 1 개 - 작업자 스레드 : 수신되는 모든 데이터를 기다려 읽고 해당 작업자 스레드의 큐에 게시하려면 epoll을 사용합니다. 패킷 수가 임계 값에 도달하면 작업자 스레드를 깨우십시오 (세마포어 사용).
1
사용 가능한 데이터의 양이 변경되면 전송되는 가장자리 트리거 이벤트 통지를 찾고 있습니다. epoll은 EPOLLET 플래그를 사용할 때처럼 작동하며, 기본적으로 알림을 초기화하여 새 패킷에 대한 알림을 계속받습니다.
두 번의 epoll_wait 호출 사이에 여러 패킷이 도착하면 한 번만 알림을받습니다.
관련 문제
- 1. 대기 스레드를 깨우는 pthread 기반 이벤트
- 2. 안드로이드에서 카메라를 깨우는 방법?
- 3. V를 사용하여 지정된 P를 깨우는 방법?
- 4. PHP 스크립트로 PC를 깨우는 방법?
- 5. 화면으로 내 가속도계를 깨우는 방법
- 6. 작업 완료 후 Java에서 스레드를 파괴하는 방법
- 7. 방금이 UDP 패킷을받은 어댑터는 무엇입니까?
- 8. 주어진 시간에 최대 절전 모드에서 깨우는 방법?
- 9. 뚜껑이 닫힌 경우 프로그래밍 방식으로 잠에서 깨우는 방법?
- 10. 스레드를 "비우는"방법
- 11. pygtk에서 스레드를 사용하는 방법
- 12. 5 초 동안 실행 한 후 비동기 스레드를 중지하는 방법
- 13. 아이폰에서 응용 프로그램 종료 후 백그라운드 스레드를 실행하는 방법?
- 14. Java에서 지정된 시간 제한 후 스레드를 죽이는
- 15. 내보내기 후 Excel 호출 스레드를 호출하는 MVC
- 16. Java에서 스레드를 닫는 방법?
- 17. 배경 스레드를 시작하는 방법?
- 18. C# 스레드를 죽이는 방법?
- 19. forkjoinpool에 스레드를 추가하는 방법
- 20. 다르게 WCF 스레드를 설정하는 방법
- 21. 메소드 1 완료 후 호출 메소드 2
- 22. 블랙 베리에 ui 백그라운드 스레드를 중지하는 방법
- 23. C에서 다중 스레드를 만드는 방법 #
- 24. 잠자는 동안 스레드를 중단하는 방법
- 25. 안드로이드에서 ASyncTask 스레드를 중지하는 방법
- 26. Android : 대기중인 스레드를 확인하는 방법?
- 27. C 스레드에서 스레드를 병렬화하는 방법
- 28. 스레드 UI 스레드를 결정하는 방법
- 29. 파이썬에서 QT 스레드를 초기화하는 방법
- 30. main()에서 스레드를 만드는 방법
왜 이런 것이 필요합니까? – jalf