【发布时间】:2009-08-24 13:35:19
【问题描述】:
我有两个问题:
Q1) 我能否在单线程应用程序中实现异步计时器,即我想要这样的功能。
....
Timer mytimer(5,timeOutHandler)
.... //this thread is doing some other task
...
and after 5 seconds, the timeOutHandler function is invoked.
据我所知,这不能用于单线程应用程序(如果我错了,请纠正我)。我不知道是否可以使用 select 作为解复用器,但即使可以使用 select,事件循环也需要一个线程?不是吗?
我还想知道我是否可以使用 select 实现计时器(不是超时)。 Select 只等待一组文件描述符,但我想要一个按其到期超时升序排列的计时器列表,并希望 select 告诉我第一个计时器何时到期等等。所以问题归结为可以使用选择/轮询或其他事件多路分解器来实现异步计时器吗?
Q2) 现在让我们来回答我的第二个问题。 这是我的主要问题。 现在我正在使用一个专用线程来检查超时,即我有一个最小的定时器堆(到期时间),这个线程休眠直到第一个定时器到期,然后调用回调。 即代码看起来像这样
- 锁定互斥体
- 检查第一个计时器的时间
- 条件定时等待该时间(如果其他线程插入一个到期时间小于第一个计时器的计时器,则唤醒)条件等待解锁锁。
- 条件等待结束后,我们获得了锁。所以解锁它,从堆中移除计时器并调用回调函数。
- 去1
我想要这种异步定时器的时间复杂度。据我所见
- 插入为 lg(n)
- 有效期为 lg(n)
- 取消
:(这让我头晕目眩)问题是我根据他们的时间有一个最小的定时器堆,当我插入一个定时器时,我得到一个唯一的 id。所以当我需要取消定时器时,我需要提供这个定时器 id 并且在堆中搜索这个定时器 id 最坏的情况是 O(n)
我错了吗?
可以在 O(lg n) 内完成取消
请注意一些多线程问题。一旦我得到一些回应,我会详细说明我上一句的意思。
【问题讨论】:
-
你在哪个平台上写这个?例如,Windows 有一些 API 调用允许单线程应用程序使用 Timer。还是您想编写自己的操作系统?
-
大家好,我正在研究 *nix 系统,即任何 posix 兼容系统 linux、solaris 和其他 unice。我正在使用 pthreads。
标签: multithreading unix pthreads