- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
基于我在 linux/include/linux/jiffies.h 中找到的代码:
41 #define time_after(a,b) \
42 (typecheck(unsigned long, a) && \
43 typecheck(unsigned long, b) && \
44 ((long)(b) - (long)(a) < 0))
在我看来,没有涉及任何环绕监控。因此,如果 jiffies(a) 环绕并返回到非常接近超时 (b) 的位置,那么结果将是“假”,而实际上它是“真”。
让我们在这个例子中使用一些相当小的数字。比如,time_after(110,150)
,其中 110 是 jiffies,150 是超时。结果显然是错误的——无论 jiffies 是否环绕:150-110 总是 > 0。
所以,我只是想确认我没有遗漏任何东西,事实确实如此。
最佳答案
需要说明的是,在您的示例中,因为 110 不在 150 之后,time_after(110,150)
应该(并且确实)返回 false。来自评论:
time_after(a,b) returns true if the time a is after time b.
另外,请注意代码确实处理了回绕到 0 的问题。为了让下面的内容更容易理解,我将使用无符号和有符号的一字节值,即 8 位 2 的补码。但是这个论点是普遍的。
假设 b 为 253,5 个滴答后 jiffies 回绕到 2。因此我们期望 time_after(2,253)
返回 true。它确实如此(使用 int8_t 表示带符号的 8 位值):
(int8_t) 253 - (int8_t) 2 == -3 - 2 == -5 < 0
您也可以尝试其他值。这个比较棘手,对于 time_after(128, 127)
,这也应该是正确的:
(int8_t) 127 - (int8_t) 128 == 127 - (-128) == 255 == -1 (for 8-bit 2's complement) < 0
实际上,表达式 (int8_t) 127 - (int8_t) 128
的类型是一个 int,值实际上是 255。但是使用 long 表达式类型将是 long 并且等效示例是,对于 time_after( 2147483648, 2147483647)
:
(long) 2147483647 - (long) 2147483648 == 2147483647 - (-2147483648) == 4294967295 == -1 < 0
最终,环绕后,“之后”的 jiffies 值 a
将开始 catch 之前的值 b
,并且 time_after(a,b )
会报错。对于 N 位 2 的补码,当 a
比 b 晚 2^(N-1) ticks 时会发生这种情况。对于 N=8,当 a
在 b 之后 128 个刻度时会发生这种情况。对于 N=32,这是 2147483648 个滴答声,或者(1 毫秒滴答声)大约 25 天。
对于数学倾向的人,我相信一般 time_after(a,b)
返回真当且仅当 (a-b) 的最小残差(模 2^N)是 > 0 且 < 2^( N-1).
关于linux - time_after() linux 宏关于 jiffies 的回绕是否 100% 万无一失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234597/
假设我有三个 div - 红绿蓝,具有以下基本标记和样式:https://jsfiddle.net/ar8sn1o6/ Red Green Blue .red, .green, .blue { d
我是一名优秀的程序员,十分优秀!