dcd
May 24, 2010, 10:31am
1
刚接触多线程,所以想自己试着变一下,我想在QNX操作系统下实现两个线程,一个计时,一个计数的功能,当计时到8.0秒以后,计数器可以计到多少数,也不知道自己程序写得对不对。目前的问题就是我想要在计时8秒,而在下面的时间输出中输出了也8秒,但是在实际中4秒钟程序就结束了,我实在是想不通,程序简陋,不过请各位高手帮忙看看啊
#include
#include
#include <boost/timer.hpp>
#include <pthread.h>
void *count(void *arg)
{
double k=(double )arg;
for(;
{
*k=*k+1;
}
return NULL;
}
int main(int argc, char *argv[])
{
std::cout<<“Test Start”<<std::endl;
double j=0;
double i=&j;
boost::timer t1;
t1.restart();
pthread_create(NULL,NULL,count,(void )i);
while(((t1.elapsed()-8.0)>1.0e-3)||((t1.elapsed()-8.0)<-1.0e-3))
{
}
std::cout<<"the number counting is "<<*i<<std::endl;
std::cout<<"the time is "<<t1.elapsed()<<std::endl;
return 0;
}
dcd
May 24, 2010, 1:37pm
2
请xtang 等各位高手多多指点,为什么我分的线程越多,实际中所记录的时间越
短,基本上是我实际想要实现的时间除以我定义的线程个数,最后程序还会返回
memory fault(core dumped)的字样,我实在是不明白啊。。
我不确信boost::timer的准确动作定义。
你试试把 t1.restart() 放到所有的pthread_create()以后,看有什么变化?或者更简单的,用个 sleep(8 ) 来代替它。
dcd
May 25, 2010, 2:39am
4
十分感谢xtang的回答,昨天晚上通宵找到原因了,boost库的计时实际上是调用
了两次clock函数的减法,而在clock函数的描述中,提到了如果使用多线程,那
么clock函数的计时将会是两个线程时间的总和,所以才产生了缩短时间的效果。
我想在请教xtang几个问题
1.我现在使用的是一种软件计时的方式,也就是循环判断是否已经到时间了,那
么我能不能用硬件计时呢?比如说使用timer.h,再或者说neutrio.h里有一些可用
的函数?
2.最后时不时的出现memory fault(core dumped)的字样,这是不是与我输入第
二线程的指针参数有关呢?
程序实在是有点简陋,我其实不好意思贴出来的,不过还希望xtang指点~~~~
dcd
May 25, 2010, 3:07am
5
按照xtang说的使用sleep()函数方便了很多啊。。早知道就不用这么麻烦的计时方式了。。。。
dcd:
1.我现在使用的是一种软件计时的方式,也就是循环判断是否已经到时间了,那么我能不能用硬件计时呢?比如说使用timer.h,再或者说neutrio.h里有一些可用
的函数?
2.最后时不时的出现memory fault(core dumped)的字样,这是不是与我输入第
二线程的指针参数有关呢?
程序实在是有点简陋,我其实不好意思贴出来的,不过还希望xtang指点~~~~
当然可以用系统的时钟,只是有没有必要的问题。如果你的主线程只是要等8秒,什么也不干的话,sleep()就解决问题了。如果你的主线程需要做些别的事,那么可以设时钟。
memory fault具体要看程序才能知道。我猜测是因为你的线程其实是在access主程序堆栈的j。如果主程序先退出,J的内存无效了的话,线程去读写 *k 是会 memory fault的。
dcd
May 25, 2010, 6:15am
7
哦,原来如此。谢谢你的指点。
请问如果我想要us级别甚至更小的计时精度时,我应该使用什么计时函数比较好呢?
看什么用途了。
如果你是要“计时”,那么ClockCycle()可以精确到CPU周期,足够你用了。
如果你是要“时钟”,比如 "2us 后通知我“,这个需要你在自己的系统里挂更精确的中断源来实现。
dcd
May 25, 2010, 6:52am
9
恩。。我应该时需要第二种功能吧。我想要做一种实时仿真程序,而且仿真
步长要在us级别,比如说5us吧,那么我就是应该每5us通知仿真程序说“时间到
了”,要进行下一步长的仿真了,以确保仿真时间和现实时间的对应。
用CPU无法产生吗?必须使用外界的中断源吗?
xtang1
May 25, 2010, 2:04pm
10
我的意思是“操作系统外"的中断源。如果你的CPU有额外的时钟中断可以用,你完全可以用。或者你的系统里有别的硬件能产生足够精度的中断的话,你也可以用。实在没有,那就只能用“外部的中断源”了。
dcd
May 25, 2010, 2:50pm
11
呵呵,我的基础知识不牢固,你说的我会仔细查阅一下各方面知识的。
还有一个问题:请问xtang,clockperiod()函数的功能是什么啊?我看见help里在说到
default ticks时说到了这个函数,我又看了一下这个函数的帮助,它貌似是可以设定始终周
期,请问这是不是就是说我能自己设定一个更小的ticks呢?
xtang1
May 26, 2010, 2:05am
12
ClockPeriod()设的是全系统的时钟。设得太低会使系统负荷大大提高,甚至用户进程没有时间执行。所以这个函数有个限度的。
Since a very small tick size imposes an interrupt load on the system, and can consume all available processor cycles, the kernel call limits how small a period can be specified. The lowest clock period that can currently be set on any machine is 10 microseconds.
另外,即使是10us也是很低的数字了,对于你这样的us级的时钟要求,最好的是用自己的中断源,这样不影响系统负荷,也不影响别的用户进程。
dcd
May 26, 2010, 2:43am
13
好的,我明白了,终于感觉对于QNX不像刚接触时那么陌生了,十分感谢你,xtang!!
dcd
May 26, 2010, 7:26am
14
不好意思,xtang,还要再麻烦你一下,请问你用过clockperiod这个函数吗?我只是想
试试这个函数的功能,希望减小ticks来测试一些东西,但是怎么都不成功,很明显ticks
还是1ms,我是按照他的说明,参数给的
struct _clockperiod clock_period;
clock_period.nsec=1.0e3;
clock_period.fract=0;
ClockPeriod(CLOCK_REALTIME,&clock_period,NULL,0);
是不是只要出入这个命令以后,我整个程序运行的时候,不论调用什么关于t时间的指令时,
ticks都是1us呢?还是说我什么地方使用错了?
xtang1
May 26, 2010, 9:22am
15
dcd:
不好意思,xtang,还要再麻烦你一下,请问你用过clockperiod这个函数吗?我只是想
试试这个函数的功能,希望减小ticks来测试一些东西,但是怎么都不成功,很明显ticks
还是1ms,我是按照他的说明,参数给的
struct _clockperiod clock_period;
clock_period.nsec=1.0e3;
clock_period.fract=0;
ClockPeriod(CLOCK_REALTIME,&clock_period,NULL,0);
是不是只要出入这个命令以后,我整个程序运行的时候,不论调用什么关于t时间的指令时,
ticks都是1us呢?还是说我什么地方使用错了?
要养成每个函数调用都要查返回值的习惯。如果你查了ClockPeriod()的返回值,你就会发现ClockPeriod出错了,出错值是EINVAL。
在前面的帖子里,我转抄了ClockPeriod()手册里的这句话,”The lowest clock period that can currently be set on any machine is 10 microseconds.“ 想来你没有仔细看。
dcd
May 26, 2010, 10:47am
16
我晕,我突然发现我把help里面还有您上面回的贴的所有的microsecond看成了毫秒。。
我错了。。。。。
xtang1
May 26, 2010, 11:56am
17
呵呵,我当初也搞过好几次。
1秒 = 1000毫秒 = 1000000微秒 = 1000000000纳秒
1s = 1000ms = 1000000us = 1000000000ns
顺便问一句,1us 即使对于计算机来说,也是个很小的数字了,你确信你的要求是5us时钟吗?普通的中断延迟都不止5us吧。
dcd
May 26, 2010, 12:37pm
18
是的,仿真时有时候仿真步长是1us都有可能的。我从没有深入的搞过计算机,所以这次
才这么多次麻烦您的。
我也还真没考虑过中断延迟。我一开始用timer.h的函数生成一个脉冲之类。但是用
timer.h没办法产生一个1us级的信号。所以我才想要用别的方法,比如说精确的中断
源,目的就是想要得到准确的时间,比如说每2.5us能够通知我“该干下一步事情了”。如
果中断延迟也要考虑进来的话,那看来我可能要再考虑考虑其他更好的方法了。也希望
xtang给些建议,呵呵。
另外我还有个问题:是不是说每过一个ticks,cpu都要重新分配资源和调度呢?那样的
话,我怎么保证我自己编的程序在该程序的运行中一直占有者cpu呢?事实上好像我自己
编的程序确实一直占据着cpu,是因为默认的优先级高吗?看来我得把有关neutrio那部分
帮助看全了才行啊。