2010-03-09 2 views
9

다른 간격으로 업데이트해야하는 항목 목록이 있습니다. 목록은 수천 개의 항목으로 길어질 수 있습니다. 각 항목은 잠재적으로 다른 간격을 가질 수 있습니다. 항목 당 하나의 타이머를 만들면 스레드로 시스템을 채 웁니까? 항목 세트에서 가장 작은 간격과 동일한 하나의 타이머를 작성한 다음 각 업데이트 증가 카운터에 카운터를 추가 한 다음 카운터가 다른 간격과 동일한 지 확인하십시오. 가장 작은 간격이 다른 모든 간격의 배수이면이 방법이 효과적입니다. 어떤 제안?boost :: asio :: deadline_timer는 각 타이머에 대해 스레드를 사용합니까?

답변

12

부스트는 타이머마다 스레드를 사용하지 않고 타이머 대기열을 유지합니다. 모든 타이머는 실제 작업을 수행하는 boost::asio::io_service 개체로 만들어집니다.

이 오브젝트는 작업을 하나 이상의 스레드 when you run boost::asio::io_service::run() explicitly from multiple threads에 디스패치 할 수 있지만 타이머와 스레드 간에는 일대일 대응이 없으므로 Asio는 뒤에 스레드를 작성하지 않습니다.

+0

괜찮 으면 좋겠지 만 "하나 이상의"스레드로 작업을 보냅니다. 기본적으로 하나의 io_service에 바인딩 된 1000 개의 타이머를 만들고 하나의 스레드에서 io_service를 호출하면 모든 해당 타이머가 하나의 새 스레드에서 수행됩니까? 분명히 그들은 timer :: async_wait를 호출 할 때 호출 스레드에서 수행되지 않습니다. 맞습니까? 또한이 기능에도 불구하고 말한 것처럼 내 디자인이 많은 타이머를 만드는 것보다 바람직합니까? 아니면 본질적으로 타이머가 어쨌든 복제하는 것인가? – Rhubarb

+6

(1) 예, 스레드 A에서 IO 서비스를 실행하면 모든 타이머 핸들러가 스레드 A에서 실행됩니다. (2) 수작업으로 계산하는 것보다 유지 관리가 가능하고 오류가 발생하기 쉽기 때문에 많은 타이머를 만드는 것이 좋습니다 하나의 타이머 (당신은 1 : 1 관계 b/w 작업 항목과 타이머를 가짐)의 간격. –

+2

추신 그리고 예, 이미 Asio가 작업을 복제하고 있습니다 (가장 오래된 만료 타이머 추적). –

1

Recent versions, 부스트 1.43 이상, API를 deadline_timer에 사용하십시오.

을 사용할 수있는 경우 Linux에서 타이머를 디스패치하기 위해 timerfd를 사용하도록 변경되었습니다.

관련 문제