如何让程序,延时1微秒?要求是:

iuruteiu 2014-04-24 02:02:57
1、是微秒,不是毫秒。
2、不要求精确。(如:最终延时了3微秒,也是可以接受的)
3、延时过程中,要求CPU占用率,要为零。不能是下面形式,下面while形式,cpu占用率是满爆的。

while(true)
{
读取精确到微秒时间
时间计数
计数比较
.........
}

4、std::this_thread::sleep_for(std::chrono::microseconds(1));这种方法试过来,实际上只是1毫秒,不是1微秒。

5、用Socket的select也试过了,struct timeval tv;虽然有微秒的设置,但是,当tv_usec小于1000以下,全都是1毫秒。

6、std::timed_mutex mtx;的成员函数try_lock_for(std::chrono::microseconds(1))也试过了,实际上,也只是1毫秒,不是1微秒。




...全文
1811 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Archimender 2016-07-18
  • 打赏
  • 举报
回复
引用 28 楼 Archimender 的回复:
Thread.currentThread().sleep(0,nanoseconds);//0毫秒加多少纳秒 应该可以,只是我不太理解,它为什么会提供这样一个明显精度达不到的接口
啊,不对,这个函数并不支持 源码: public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); }
Archimender 2016-07-18
  • 打赏
  • 举报
回复
Thread.currentThread().sleep(0,nanoseconds);//0毫秒加多少纳秒 应该可以,只是我不太理解,它为什么会提供这样一个明显精度达不到的接口
灌水号 2016-07-18
  • 打赏
  • 举报
回复
裸机可以实现.
wen_eric 2016-07-18
  • 打赏
  • 举报
回复
必须在实时操作系统下才能达到微秒的要求。 windows下是不行的。不是你程序不行,是这个运行的平台不支持! 换系统吧。
让菜鸟飞 2014-04-26
  • 打赏
  • 举报
回复
Sleep和Timer名义上能精确到1毫秒,但是实际上都只能精确到15毫秒,只有多媒体计时器能精确到1毫秒。 1微妙,做不到,硬件能做到,操作系统以上的做不到
707wk 2014-04-26
  • 打赏
  • 举报
回复
引用 13 楼 menzi11 的回复:
微妙级别,任何线程等待都是没戏的,因为线程切换的时间都比微秒大 ,更别提等待了,CPU占用率为0就更不可能了,cpu占用率的统计计数器的增长 单位都比微秒大的多,这种情况下只能忙等待: for(int i=900;i>0;i/=11); 差不多能延迟1微妙吧
这种延迟跟cpu的主频有很大关系
menzi11 2014-04-26
  • 打赏
  • 举报
回复
引用 24 楼 dianyancao 的回复:
试试内嵌汇编插入NOP指令
一个nop也就延迟不了几个周期,得写多少个啊.....
dianyancao 2014-04-26
  • 打赏
  • 举报
回复
试试内嵌汇编插入NOP指令
赵4老师 2014-04-25
  • 打赏
  • 举报
回复
谁要是真能做到精确延时一微秒的话,赶快为国防科技做出点力所能及的贡献去吧!
lm_whales 2014-04-25
  • 打赏
  • 举报
回复
用驱动做做看,不过不要奢求,界面会及时响应1us的这么快。
bfdeh 2014-04-25
  • 打赏
  • 举报
回复
楼主什么平台?x86 linux/windows?还是嵌入式?你得说清楚啊。
mujiok2003 2014-04-25
  • 打赏
  • 举报
回复
找找实时操作系统
神-气 2014-04-25
  • 打赏
  • 举报
回复
操作系统得是实时操作系统吧,windows这样的估计没戏。 可以先测试一下CPU速度: long long llCount = 0; time_t t1 = time(); while(llCount++ < 1000000LL){} time_t t2 = time(); long long llUsCounter = llCount / (t2-t1) ; // result = count/1us 用的时候: while(i++ < llUsCounter){}
蔓延的路 2014-04-25
  • 打赏
  • 举报
回复
做空语句循环延时,低端些,但是好像符合题意
zodiac1111 2014-04-24
  • 打赏
  • 举报
回复
man 3 usleep
gz_qmc 2014-04-24
  • 打赏
  • 举报
回复
大侠,你的程序都是又操作系统调度的 操作系统提供了1ms,你就只能用一毫秒 电脑BIOS会提供一个时间的中断 但最快的也没到微秒 所以,你只有改写BIOS 可能才能达到你的要求 如果用单片机,情况又不一样了 只要晶振频率大于1MHZ就可以
xucong198949 2014-04-24
  • 打赏
  • 举报
回复
win能达到微妙级别??
ooolinux 2014-04-24
  • 打赏
  • 举报
回复
引用 13 楼 menzi11 的回复:
微妙级别,任何线程等待都是没戏的,因为线程切换的时间都比微秒大 ,更别提等待了,CPU占用率为0就更不可能了,cpu占用率的统计计数器的增长 单位都比微秒大的多,这种情况下只能忙等待: for(int i=900;i>0;i/=11); 差不多能延迟1微妙吧
这种从386到了586就不行了吧?
menzi11 2014-04-24
  • 打赏
  • 举报
回复
微妙级别,任何线程等待都是没戏的,因为线程切换的时间都比微秒大 ,更别提等待了,CPU占用率为0就更不可能了,cpu占用率的统计计数器的增长 单位都比微秒大的多,这种情况下只能忙等待: for(int i=900;i>0;i/=11); 差不多能延迟1微妙吧
iuruteiu 2014-04-24
  • 打赏
  • 举报
回复
请看题目。没有要求一微秒执行一次。
引用 11 楼 menzi11 的回复:
为什么老有人有这种需求,你确定真有这种需求而不是设计缺陷吗? 就算你实现一微妙执行一次了,但操作系统让你当前线程挂起运行个QQ, 一下就慢了几十毫秒,你又不能控制线程策略,何谈一微妙执行一次? 为何要一微妙执行一次呢? 是要跟硬件交互吗? 那就每次线程执行时查看当前时间减去 之前上一次线程挂起的时间,得到的时间差x*1000000然后执行x*1000000次就行了.
加载更多回复(11)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧