【发布时间】:2011-01-27 13:37:10
【问题描述】:
我有一个从管道获取工作的工作线程。像这样的
void *worker(void *param) {
while (!work_done) {
read(g_workfds[0], work, sizeof(work));
do_work(work);
}
}
我需要在同一个线程中实现一个 1 秒计时器,以记录有关工作的一些工作。以下是我的想法:
void *worker(void *param) {
prev_uptime = get_uptime();
while (!work_done) {
// set g_workfds[0] as non-block
now_uptime = get_uptime();
if (now_uptime - prev_uptime > 1) {
do_book_keeping();
prev_uptime = now_uptime;
}
n = poll(g_workfds[0], 1000); // Wait for 1 second else timeout
if (n == 0) // timed out
continue;
read(g_workfds[0], work, sizeof(work));
do_work(work); // This can take more than 1 second also
}
}
我使用系统正常运行时间而不是系统时间,因为系统时间可以在此线程运行时更改。我想知道是否还有其他更好的方法可以做到这一点。我不想考虑使用另一个线程。使用alarm() 不是一个选项,因为它已被同一进程中的另一个线程使用。这是在 Linux 环境中实现的。
【问题讨论】:
-
嘿嘿.. 它实际上是一回事。
-
其实不一样,select()有固定数量的socket会读取(1024)而poll()不会。
标签: c multithreading unix timer