2012-04-06 2 views
0

1 ~ 2 마이크로 초 동안 스레드를 일시 중단 할 수있는 방법이 있습니까? (1 마이크로 초 = 1/1000 밀리 세컨드). 나는이 질문이 있지만 지금까지는 이것에 대한 좋은 대답이 없다는 것을 알고있다. 여기에 내 상황이 왜 필요합니까 :낮은 대기 시간 스레드 통신을위한 Windows 슬립 마이크로 초

클라이언트 요청을 처리하기 위해 여러 스레드가있는 서버가 있습니다. 요청은 때때로 발생하는 공유 메모리를 통해 다른 스레드에 의해 전송됩니다. 그러나 요청이 일단 전송되면 최대한 빨리 처리해야합니다. 따라서 요청이 공유 메모리에 대기 중일 때 서비스중인 스레드 중 하나를 알리는 빠른 방법이 필요합니다.

Windows 이벤트 객체가 사용되었지만 SetEvent()에서 WaitForSingleObject()로 돌아가서 내 컴퓨터에서 반환됩니다 (프로세스/스레드 우선 순위를 설정하려고했지만 여전히 개선되지는 않았습니다). 바쁜 루프를 사용하여 대기열을 1-2us로 낮추는 메모리 풀링을 유지하려고했지만, 요청이 분당 한 번만 전송되는 동안 CPU를 소모합니다. 루프에 마이크로 초/나노 초 수면을 삽입 할 수 있다면 대기 시간을 낮게 유지하면서 적어도 CPU를 무료로 사용할 수 있습니다.

누군가 2us보다 낮은 대기 시간으로 스레드 통신을 수행하는 다른 방법을 제안 할 수 있다면 기쁠 것입니다. 감사합니다

+2

이 방향으로 들어 가지 마십시오. 이와 같은 시나리오 (실시간 애플리케이션이 아닌)에서 이러한 수면을 필요로하는 이유는 IMHO가 깨진 설계를 나타냅니다. – Matthias

+0

저는 이것이 "커널 링"에서만 신뢰할 수 있다고 생각합니다. –

+0

Bus-waiting을 수행하는 "덜 비싼 방법"인 Thread.SpinWait()이 있습니다. 그러나 : _ "요청은 분당 한 번만 전송됩니다"는 의미는 아닙니다. 분 기반의 상황에서 어떻게 문제가 발생합니까? –

답변

0

나는 그 기간 동안 스레드를 잠을 수 없다고 생각합니다.

지난 번 (약 10 년 전, Windows 2000에서 마음에 드는) 13ms 미만의 시간 동안 잠을 자다가 0ms 또는 13ms의 잠을 잤습니다.

Windows는 실시간 운영체제가 아닙니다.

고해상도 타이머를 사용하여 해당 기간 동안 스레드를 회전시킬 수 있습니다.

솔직히 말해서 디자인에 결함이있는 것은 거의 확실합니다.

방금 ​​게시물을 읽었습니다. 문제는 스레드 모델입니다. 당신은 작업자 풀이 있습니다. 이것은 본질적으로 OS 간 서비스가 필요하기 때문에 문제가되는 크로스 스레드 통신이 필요합니다. 대안은 코어 당 하나의 스레드이며, 이들 스레드간에 대칭을 갖는다. 그들은 모두 모든 일을하고 당신은 그들 사이에 짐을 공유합니다.

관련 문제