다른 간격으로 업데이트해야하는 항목 목록이 있습니다. 목록은 수천 개의 항목으로 길어질 수 있습니다. 각 항목은 잠재적으로 다른 간격을 가질 수 있습니다. 항목 당 하나의 타이머를 만들면 스레드로 시스템을 채 웁니까? 항목 세트에서 가장 작은 간격과 동일한 하나의 타이머를 작성한 다음 각 업데이트 증가 카운터에 카운터를 추가 한 다음 카운터가 다른 간격과 동일한 지 확인하십시오. 가장 작은 간격이 다른 모든 간격의 배수이면이 방법이 효과적입니다. 어떤 제안?boost :: asio :: deadline_timer는 각 타이머에 대해 스레드를 사용합니까?
9
A
답변
12
부스트는 타이머마다 스레드를 사용하지 않고 타이머 대기열을 유지합니다. 모든 타이머는 실제 작업을 수행하는 boost::asio::io_service
개체로 만들어집니다.
이 오브젝트는 작업을 하나 이상의 스레드 when you run boost::asio::io_service::run()
explicitly from multiple threads에 디스패치 할 수 있지만 타이머와 스레드 간에는 일대일 대응이 없으므로 Asio는 뒤에 스레드를 작성하지 않습니다.
1
Recent versions, 부스트 1.43 이상, API를 deadline_timer
에 사용하십시오.
을 사용할 수있는 경우 Linux에서 타이머를 디스패치하기 위해 timerfd를 사용하도록 변경되었습니다.
관련 문제
- 1. 메모리 조각화 @ boost :: asio?
- 2. C++ Boost ASIO 간단한주기 타이머?
- 3. boost asio io_service.run()
- 4. boost :: asio :: async_resolve 문제
- 5. Boost :: asio 및 async_read
- 6. boost :: asio :: async_read_until 문제
- 7. boost :: asio : 들어오는 연결을 받아들이려면 async_accept를 어떻게 사용합니까?
- 8. boost :: asio :: io_service가 예외를 던졌습니다
- 9. Boost Library의 Asio 만 사용하는 방법은 무엇입니까?
- 10. performSelectorInBackground는 각 호출에 대해 새 스레드를 생성합니까?
- 11. Protobuf 메시지 보내기 boost :: asio
- 12. 일부 작업 연속화 - boost :: asio
- 13. boost :: asio 서버 다중 프로세스
- 14. boost :: asio 깨끗하게 연결 해제
- 15. Boost :: asio async_wait 처리기 서명
- 16. boost :: asio :: async_read를 stdin과 함께 사용 하시겠습니까?
- 17. 권한을 캐싱하거나 각 요청에 대해 데이터베이스를 사용합니까?
- 18. Boost :: asio 소켓 - 연결을 끊는 방법?
- 19. boost asio ssl stream 소켓 컴파일 문제
- 20. boost :: asio :: ip :: tcp :: resolver :: iterator는 무엇을합니까?
- 21. boost :: asio 비동기 작업 및 리소스
- 22. Boost Asio io_service, 클라이언트에서 메시지 읽기
- 23. boost :: asio :: streambuf를 사용하는 코드가 segfault를 발생시킵니다.
- 24. Boost :: Asio :: Ip :: Tcp :: Iostream 질문
- 25. boost :: asio tcp async_read 결코 반환하지 않습니다.
- 26. boost :: asio :: local :: stream_protocol :: iostream이 작동하지 않습니까?
- 27. boost :: asio :: async_read texutal 정지 조건?
- 28. boost :: asio timeouts 예 - 데이터 쓰기가 비쌉니다.
- 29. C++, boost asio, 널 종료 문자열 수신
- 30. 차단을위한 C++ boost asio timeout 연결
괜찮 으면 좋겠지 만 "하나 이상의"스레드로 작업을 보냅니다. 기본적으로 하나의 io_service에 바인딩 된 1000 개의 타이머를 만들고 하나의 스레드에서 io_service를 호출하면 모든 해당 타이머가 하나의 새 스레드에서 수행됩니까? 분명히 그들은 timer :: async_wait를 호출 할 때 호출 스레드에서 수행되지 않습니다. 맞습니까? 또한이 기능에도 불구하고 말한 것처럼 내 디자인이 많은 타이머를 만드는 것보다 바람직합니까? 아니면 본질적으로 타이머가 어쨌든 복제하는 것인가? – Rhubarb
(1) 예, 스레드 A에서 IO 서비스를 실행하면 모든 타이머 핸들러가 스레드 A에서 실행됩니다. (2) 수작업으로 계산하는 것보다 유지 관리가 가능하고 오류가 발생하기 쉽기 때문에 많은 타이머를 만드는 것이 좋습니다 하나의 타이머 (당신은 1 : 1 관계 b/w 작업 항목과 타이머를 가짐)의 간격. –
추신 그리고 예, 이미 Asio가 작업을 복제하고 있습니다 (가장 오래된 만료 타이머 추적). –