2012-04-06 133 views
0

有什么办法可以暂停1-2微秒的线程? (注1微秒= 1/1000 miliseond)。我知道这个问题已被问到,但到目前为止没有好的答案。这是我的情况,为什么我需要这个:Windows睡眠微秒用于低延迟线程通信

我有一个服务器与多个线程运行服务客户端的请求。请求由其他线程通过偶尔发生的共享内存发送。但是,一旦发送请求,就需要尽快处理。所以,当请求在共享内存中排队时,我需要一种快速的方式来通知其中一个服务线程。

使用了Windows事件对象,但它需要6-7us从SetEvent()到WaitForSingleObject()在我的机器上返回(试图设置进程/线程的优先级,但仍然没有太大的改进)。我试图使用一个繁忙的循环让服务线程保持池的内存,从而将延迟降低到1-2us,这足够好,但它会烧毁CPU,而请求只发送一次,如每分钟一次。如果我可以在循环中插入微秒/纳秒睡眠,我至少可以让我的CPU空闲,同时保持低延迟。

我会很高兴,如果任何人都可以建议我另一种方式进行线程通信延迟低于2us。谢谢

+2

不要进入这个方向。在这种情况下(这不是实时应用),需要进行这样的睡眠表明恕我直言,一个破碎的设计。 – Matthias 2012-04-06 07:24:42

+0

我认为这只能在“内核环”中可靠地完成。 – 2012-04-06 07:24:44

+0

Thread.SpinWait()是一种“较便宜的方式”来执行忙等待。但是:_“请求只是每分钟发送一次”_表示不这样做。在基于分钟的情况下,你有什么问题? – 2012-04-06 07:32:24

回答

0

我觉得你不能睡那个时期的线程。

我上次测试(大约10年前,介意,在Windows 2000上)睡眠时间小于13ms导致睡眠时间为0ms或13ms。

Windows不是实时操作系统。

您可以使用高分辨率定时器旋转该时间段的线程。诚实地说,尽管它几乎肯定意味着设计是有缺陷的。

我刚刚看过帖子;问题是线程模型。你有一个工作人员池。这固有地要求跨线程通信,这是有问题的,因为它需要OS服务。另一种选择是每个核心有一个线程,在这些线程之间具有对称性,例如,他们都会做所有事情,并分担他们之间的负担。