【发布时间】:2015-09-08 12:01:59
【问题描述】:
我目前正在处理共享内存,我想计算花费的时间 thread1 要写入,thread2 从共享内存中读取。为此我使用了:
clock_gettime(CLOCK_REALTIME,&start)
在线程 1 中,并在从线程 2 读取之后。我又打电话了:
clock_gettime(CLOCK_REALTIME,&end)
阅读和写作所用的时间可以通过以下方式计算:
dt = (double) (end.tv_sec - start.tv_sec) +
((double) (end.tv_nsec - start.tv_nsec) / 1000000000.0);
但是每次我运行程序时,我都会得到不同的结果。 我做错了什么?
【问题讨论】:
-
当您说“不同的结果”时,您能说得更具体一点吗?你得到什么范围?而且由于您使用挂钟,您知道 Linux 是一个多任务操作系统内核,它可能会暂停您的进程并让其他进程工作,并且您无法真正控制您的进程可能执行多长时间或多少次暂停,那当然会扭曲你的结果。为了得到更好的结果,将操作进行数千次(甚至数百万次),并计算平均时间。
-
感谢 Joachim,我们正在使用基于优先级的抢先调度。除了中断假设,最高优先级线程将被调度。有时我们得到 0.000367 秒,有时是 0.004442 秒,我认为这个余量很高。如果我错了,请纠正我
-
系统中是否有其他同等或更高优先级的进程在运行?如果不是,那么是的,这似乎是一个很大的范围。
-
clock_gettime()中的开销(必须发出序列化指令)可能比单个写入/读取共享内存的时间大一个数量级。尝试在两个进程之间对数据进行 ping-ponding 数千次,然后测量 那个(然后除以次数)。 -
另外,对于这样的应用程序,您可能应该使用
CLOCK_MONOTONIC而不是CLOCK_REALTIME- 请参阅stackoverflow.com/questions/3523442/… 和linux.die.net/man
标签: c pthreads shared-memory