Articles of 睡眠

如何使线程睡眠/阻塞纳秒(或至less几毫秒)?

我怎么能阻止我的线程(也许进程)纳秒或可能一毫秒(至less)期? 请注意,我不能使用睡眠,因为睡觉的参数总是在几秒钟内。

处于睡眠状态的CPU利用率较高

我有一个似乎陷入僵局的过程: # strace -p 5075 Process 5075 attached – interrupt to quit futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL 它坐在“futex”系统调用,似乎是无限期地等待锁。 当“top”运行时,这个过程显示消耗了大量的CPU: # top -b -n 1 top – 23:13:18 up 113 days, 4:19, 1 user, load average: 1.69, 1.74, 1.72 Tasks: 269 total, 1 running, 268 sleeping, 0 stopped, 0 zombie Cpu(s): 8.1%us, 0.1%sy, 0.0%ni, 91.8%id, 0.0%wa, 0.0%hi, […]

如何睡在Linux内核?

我可以使用msleep()函数在内核空间中睡眠指定的时间吗? 如果是这样,我需要包括哪些头文件? #include <linux/time.h>似乎不是正确的。 为此目的可能有更好的function吗?

nanosleep高CPU使用率?

我注意到一个调用nanosleep的小testing程序,在内核比2.6.22更新的Linux机器上运行时,显示CPU使用率的巨大差异。 #include <time.h> int main (void) { struct timespec sleepTime; struct timespec returnTime; sleepTime.tv_sec = 0; sleepTime.tv_nsec = 1000; while (1) { nanosleep(&sleepTime, &returnTime); } return 0; } (是的,我知道这个程序什么都不做) 如果我编译并在openSUSE 10.3机器(2.6.22.19-0.2-default)上运行它,程序甚至不会显示在由“top”生成的进程列表中,这表明它正在使用很less的CPU时间。 如果我在openSUSE 11.1机器(2.6.27.23-0.1-default)上运行它,top会显示占用40%CPU时间的程序。 在Fedora 9(2.6.25-14.fc9.i686)和Fedora 10上运行的时候,在“top”中也显示了相同的高CPU使用率。 内核的变化是否影响到了这一点?

我怎样才能唤醒睡眠的pthread?

我正在用C ++编写一个程序。 我注意到,它正在获得一些线程,其目的是间隔地做一些事情,其中​​有3或4个。 我决定通过编写一个调度程序服务来重构使用这些线程的其他地方可以订阅的调度程序服务,这可以将我在任何时候运行的额外事件线程的数量减less到一个。 我还没有任何使用这个代码, 在我开始写之前,我想知道是否有可能,并对我的devise得到一些反馈。 我想要完成的简短描述是这样的: 添加事件 来电者提供一个事件和一个时间表 时间表提供下一次事件的发生 (事件,时间表)对被添加到事件队列中 中断睡眠事件线程(即唤醒它) 事件线程主循环 尝试获取事件队列中的下一个事件 如果没有未决事件,请直接前往4 获取下一个事件应该发生的时间 睡觉,直到下一个事件(或永远,如果没有等待事件) 如果因任何原因中断了睡眠,请循环回到1 如果睡眠成功完成,请执行当前事件 更新队列(删除事件,如果是重复事件则重新插入) 跳回到1 我已经做了一些研究,并且知道可以中断睡眠线程,并且我相信只要不能同时访问事件队列,就不应该有任何危险的行为。 我可以想象,唤醒一个线程是可能的,在某些情况下,java的Thread的sleep()调用会抛出一个InterruptedExceptionexception,除非它不依赖于操作系统的底层睡眠调用,否则就有可能。 题 任何人都可以评论我的做法吗? 这是一个轮子,我会更好,而不是重塑? 具体来说,如何中断一个睡眠线程,以便在下一条指令处继续执行,并且是否可以从中断的线程中检测到这种情况? 关于提升的说明 我敢打赌,你可以用boost来编写一个调度程序,但是这个编译和运行在一台机器上,因为缺less一个更好的短语,一堆废话。 我之前编译过boost程序,每个拉动boost的文件通常需要花费30多秒才能编译。 如果我能避免这个令人不愉快的发展障碍,我很想。 附录 – 工作守则[根据咖啡店的build议修订] 这是我制作的代码。 它已经过了基本的testing,但是已经适当地处理了不同延误的单一事件和重复事件。 这是事件线程的主体: void Scheduler::RunEventLoop() { QueueLock(); // lock around queue access while (threadrunning) { SleepUntilNextEvent(); // wait for something to […]

试图模拟恒定的字节速率。 与time.sleep结果混淆

上下文 我在我的计算机上使用Windows 7(播放器)和我的大学计算机上的Linux(debian)(stream式传输),我使用ssh来控制它。 我试图通过阅读一个wave文件模拟一个麦克风的恒定字节速率,就好像有人在说话一样。 问题是字节率低于目标。 select32KB / s速率,捕获时间为0.020秒。 我使用time.sleep来实现模拟麦克风,以产生每个0.020秒的每个数据块。 但是所得到的速率是大约27KB / s,而不是32KB / s 问题 我决定在linux机器上testing多less准确的time.sleep,通过阅读这个问题来使用想法。 我做了两种testing。 1)忙碌的睡眠2)正常的睡眠 平均而言,从我得到的样本中可以看出,Linux机器的睡眠分辨率是4ms。 在窗户上它less于/等于1ms。 问题 什么可能会限制在Linux机器上的睡眠分辨率? (在Linux上)为什么忙碌睡眠与time.sleep具有相同的分辨率? 我怎样才能成功地模拟一个麦克风阅读波形文件? 码 import time def busy_sleep(t): s=time.time() while time.time() – s < t: pass e=time.time() return es def normal_sleep(t): s=time.time() time.sleep(t) e=time.time() return es def test(fun): f = lambda x: sum(fun(x) for […]

为什么在Linux中I / O是不可中断的?

它背后的理由是什么? 如果允许进行I / O的进程处理信号,会有什么坏结果呢?

Bash:无限的睡眠(无限的阻挡)

我使用startx来启动X来评估我的.xinitrc 。 在我的.xinitrc我使用/usr/bin/mywm启动窗口pipe理器。 现在,如果我杀死我的WM(为了testing其他WM),X也将终止,因为.xinitrc脚本到达了EOF。 所以我在我的.xinitrc的末尾添加了这个: while true; do sleep 10000; done 这样,如果我杀死我的WM,X将不会终止。 现在我的问题是:我怎么能做一个无限的睡眠,而不是循环睡眠? 有没有一个命令会像冻结脚本? 最好的祝福

睡眠()是不准确的?

我正在开发一个计时系统,我将实现一个计时器课程。 #include <windows.h> #include <stdio.h> #include <time.h> int main() { clock_t t1, t2; t1 = clock(); Sleep(10); t2 = clock(); printf("%i\n", (int)(t2 – t1)); return 0; } 该程序应打印“10”,但打印“15”或“16”。 我需要更准确的,这是不到1毫秒! build议? (也许用select()的超时?) 注意:我已经在Windows 7 Ultimate x86上运行该程序。 用MinGW(C / C ++)x86编译的程序 现在我想>>

在Windows上为Java准确hibernate

有没有人知道一个库,它提供了一个Thread.sleep()Java的错误不超过1-2毫秒? 我尝试了睡眠,错误测量和BusyWait的混合,但我不能在不同的Windows机器上得到这个可靠的。 如果实现可用于Linux和MacOS,则它可以是本地实现。 编辑链接尼克提供( http://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks )是一个非常好的资源来理解各种定时器/睡眠/时钟java的问题。