2013-08-11 1 views
2

내가 시나리오를 다음과 달성하는 데 필요한, 이것 좀 도와주세요 :C++에서 각 개체의 타이머를 구현하는 방법은 무엇입니까?

  1. 큐는 유지됩니다, 어떤 객체를 포함 할 것이다.
  2. 개체가 큐에 삽입되면 해당 개체에 대해 타이머가 시작됩니다.
  3. 이 신호는 이벤트가 발생할 때마다 객체에 전송한다 (이벤트는 타임 아웃 등의 약간의 오차 등일 수있다).
  4. 이 개체에 대해 발생한 이벤트가 캡처되고 개체 ID가 수신됩니다. 개체 ID는 큐에있는 개체를 구별하고 적절한 작업을 수행해야합니다.
객체의 많은 수의 작동하지 않았다

나의 접근 방식은 다음

  1. thread_function1(void *object_id);에 개체 ID를 전달하고 그것을위한 타이머로 sleep()을 사용할 각 개체에 대한 스레드를 만들 목적.
  2. 지금 다른 개체에 대해 나는이 동적으로 원하는대로 작동하지 않습니다 new thread_function2(void *object_id); 위의 방법을 만들어 같은 일을해야합니다.

운영 체제 : 리눅스.

내가 C의 ++에서 이것을 구현하려는, 그래서이 구현 적이없는 나는 전진 여러분의 도움과지도가 필요합니다. 모든 온라인 자습서, 참조 도움이 될 것입니다. 미리 감사드립니다.

+0

C++ 언어도 표준 라이브러리도 타이머를 구현하지 않습니다. 목표로하는 운영 체제에 대해 구체적으로 설명해야합니다. 그리고 당신이 일을 시도한 것을 보여주고 그것이 왜 효과가 없었는지 설명하십시오. –

+0

추가 정보 필요 – user1057741

+3

잠자는 수면 스레드를 만드는 대신 향후 이벤트 목록을 만드십시오. 다음 이벤트에서 깨어나도록 프로그래밍 된 하나의 대기 "물건"(스레드, 시스템 타이머 등)이 필요합니다. 다른 이벤트가 삽입되어 현재 가장 가까운 이벤트보다 가깝다면 대기를 취소하고 다른 이벤트를 시작하십시오. –

답변

0

짧은 대답은 : 잠을 사용하지 마십시오(). 그것은 어색한 오래된 인터페이스이므로, 어떤 코드에서도 더 이상 사용하지 않아야합니다. 특히, 잠에서

()는 적어도 스레드를 인식하지 못합니다. 오히려, 당신의 타이밍 요구를 위해 pthread 라이브러리의 함수를 사용하십시오. 예를 들어, pthread_cond_timedwait()를 사용하여 스레드가 특정 이벤트를 기다리는 시간을 제한 할 수 있습니다.

불행하게도,는 pthread 라이브러리를 만든 사람들이, 또한 표준 시스템이 읽기처럼 호출의 pthread와 호환 버전을 만들() 또는 쓰기 잊어 버렸습니다(). 그래서 다음 중 기다리는 쓰레드, 프로그래밍 :
A) 다른 스레드가 특정 상태
B 신호)를 데이터 네트워크 접속
C) 초과
여전히 엉망에 수신된다. 한 가지 해결책은 select() 및/또는 poll()을 사용하여 데이터 (사례 B) 또는 시간 초과 (사례 C)를 기다리고 pipe/fifo를 사용하여 다른 thead (사례 A)에서 신호를 보냅니다. 이를 위해 파이프의 읽기 끝을 select() 세트에 추가하고 다른 스레드가 조건을 알릴 필요가있는 경우 해당 스레드에 바이트를 쓰십시오.

이 A/B/C 시나리오의 대안은 주 스레드가 A와 C에 대해 pthread_cond_timedwait()를 사용하는 동안 네트워크 데이터 (사례 B)를 무기한 대기하는 "독자 도우미"스레드를 갖는 것입니다. 헬퍼 스레드는 pthread_cond_signal을 통해 데이터의 도착을 알릴 것이므로 기본적으로 사례 B를 사례 A로 변환합니다.BTW : 언제든지 주 스레드가 연결을 중단하도록 선택하면 네트워크 연결을 강제로 닫을 수 있으며 대기중인 도우미 스레드의 read() 호출도 종료됩니다.

+0

-1 '짧은 대답은 다음과 같습니다 : sleep()을 사용하지 마십시오. 그것은 어색한 오래된 인터페이스로, 어떤 코드에서도 더 이상 사용하지 않아야합니다. ' –

+0

@Martin James : 유닉스에서 sleep (3)은 알람() 타이머를 사용하는 것과 같은 많은 부작용과 스레드를 사용하여 전혀 상호 작용하지 않는 신호를 사용하는 것과 같은 문제를 가지고 있습니다. -resolution, 명확한 재시작 구문이없는 것, 수면이 다른 신호 등에 의해 중단되는 경우 등). nanosleep()이 있으며, 훨씬 더 잘 정의되어 있으며 부작용이 훨씬 적습니다. –

2

위로 2004 년 나는 "Practical Testing"이라는 일련의 블로그 게시물을 작성하여 C++ 타이머 구현을 테스트하는 방법을 시연했습니다. 이 시리즈는 단일 스레드를 사용하여 타이머를 처리하는 완전한 기능의 경량 타이머 대기열의 여러 버전으로 구성됩니다 (물론 타이머가 실행되면 스레드 풀에 타이머 이벤트를 전달할 수 있지만 대기열 자체는 작업 할 하나의 스레드).

코드는 Windows 용이므로 예상대로 조정해야합니다.

이 코드는 각 연결에 하나 이상의 타이머가 연결되어있는 수천 개의 네트워크 연결에서 작동하도록 설계되었습니다. 10,000 개 이상의 연결이있는 시스템에서 사용되어 잘 작동하며 효율적입니다.

에피소드 23에서는 타이머 대기열 대신 타이머 휠을 사용하는 대체 구현을 추가하고 새로운 데이터 구조가 제공하는 성능 향상을 얻는 데 필요한 절충에 대해 설명합니다.

시리즈 시작 here.

최신 작업 코드 만 필요하면 에피소드 31 here에서 다운로드 할 수 있습니다.

코드에는 단위 테스트 범위가 좋으며 (블로그 게시물의 초점 이었기 때문에), 테스트 코드를 다운로드 할 수 있습니다.

관련 문제