高手们帮忙看看这个问题是怎么回事

刚接触多线程,所以想自己试着变一下,我想在QNX操作系统下实现两个线程,一个计时,一个计数的功能,当计时到8.0秒以后,计数器可以计到多少数,也不知道自己程序写得对不对。目前的问题就是我想要在计时8秒,而在下面的时间输出中输出了也8秒,但是在实际中4秒钟程序就结束了,我实在是想不通,程序简陋,不过请各位高手帮忙看看啊


#include
#include
#include <boost/timer.hpp>
#include <pthread.h>

void *count(void *arg)
{
double k=(double)arg;
for(;:wink:
{
*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;
}

请xtang 等各位高手多多指点,为什么我分的线程越多,实际中所记录的时间越

短,基本上是我实际想要实现的时间除以我定义的线程个数,最后程序还会返回

memory fault(core dumped)的字样,我实在是不明白啊。。

我不确信boost::timer的准确动作定义。

你试试把 t1.restart() 放到所有的pthread_create()以后,看有什么变化?或者更简单的,用个 sleep(8 ) 来代替它。

十分感谢xtang的回答,昨天晚上通宵找到原因了,boost库的计时实际上是调用

了两次clock函数的减法,而在clock函数的描述中,提到了如果使用多线程,那

么clock函数的计时将会是两个线程时间的总和,所以才产生了缩短时间的效果。

我想在请教xtang几个问题

1.我现在使用的是一种软件计时的方式,也就是循环判断是否已经到时间了,那

么我能不能用硬件计时呢?比如说使用timer.h,再或者说neutrio.h里有一些可用

的函数?

2.最后时不时的出现memory fault(core dumped)的字样,这是不是与我输入第

二线程的指针参数有关呢?

程序实在是有点简陋,我其实不好意思贴出来的,不过还希望xtang指点~~~~

按照xtang说的使用sleep()函数方便了很多啊。。早知道就不用这么麻烦的计时方式了。。。。

当然可以用系统的时钟,只是有没有必要的问题。如果你的主线程只是要等8秒,什么也不干的话,sleep()就解决问题了。如果你的主线程需要做些别的事,那么可以设时钟。

memory fault具体要看程序才能知道。我猜测是因为你的线程其实是在access主程序堆栈的j。如果主程序先退出,J的内存无效了的话,线程去读写 *k 是会 memory fault的。

哦,原来如此。谢谢你的指点。

请问如果我想要us级别甚至更小的计时精度时,我应该使用什么计时函数比较好呢?

看什么用途了。

如果你是要“计时”,那么ClockCycle()可以精确到CPU周期,足够你用了。

如果你是要“时钟”,比如 "2us 后通知我“,这个需要你在自己的系统里挂更精确的中断源来实现。

恩。。我应该时需要第二种功能吧。我想要做一种实时仿真程序,而且仿真

步长要在us级别,比如说5us吧,那么我就是应该每5us通知仿真程序说“时间到

了”,要进行下一步长的仿真了,以确保仿真时间和现实时间的对应。

用CPU无法产生吗?必须使用外界的中断源吗?

我的意思是“操作系统外"的中断源。如果你的CPU有额外的时钟中断可以用,你完全可以用。或者你的系统里有别的硬件能产生足够精度的中断的话,你也可以用。实在没有,那就只能用“外部的中断源”了。

呵呵,我的基础知识不牢固,你说的我会仔细查阅一下各方面知识的。

还有一个问题:请问xtang,clockperiod()函数的功能是什么啊?我看见help里在说到

default ticks时说到了这个函数,我又看了一下这个函数的帮助,它貌似是可以设定始终周

期,请问这是不是就是说我能自己设定一个更小的ticks呢?

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级的时钟要求,最好的是用自己的中断源,这样不影响系统负荷,也不影响别的用户进程。

好的,我明白了,终于感觉对于QNX不像刚接触时那么陌生了,十分感谢你,xtang!!

不好意思,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.“ 想来你没有仔细看。

我晕,我突然发现我把help里面还有您上面回的贴的所有的microsecond看成了毫秒。。

我错了。。。。。

呵呵,我当初也搞过好几次。

1秒 = 1000毫秒 = 1000000微秒 = 1000000000纳秒
1s = 1000ms = 1000000us = 1000000000ns

顺便问一句,1us 即使对于计算机来说,也是个很小的数字了,你确信你的要求是5us时钟吗?普通的中断延迟都不止5us吧。

是的,仿真时有时候仿真步长是1us都有可能的。我从没有深入的搞过计算机,所以这次

才这么多次麻烦您的。

我也还真没考虑过中断延迟。我一开始用timer.h的函数生成一个脉冲之类。但是用

timer.h没办法产生一个1us级的信号。所以我才想要用别的方法,比如说精确的中断

源,目的就是想要得到准确的时间,比如说每2.5us能够通知我“该干下一步事情了”。如

果中断延迟也要考虑进来的话,那看来我可能要再考虑考虑其他更好的方法了。也希望

xtang给些建议,呵呵。

另外我还有个问题:是不是说每过一个ticks,cpu都要重新分配资源和调度呢?那样的

话,我怎么保证我自己编的程序在该程序的运行中一直占有者cpu呢?事实上好像我自己

编的程序确实一直占据着cpu,是因为默认的优先级高吗?看来我得把有关neutrio那部分

帮助看全了才行啊。