sleep()和usleep()的使用和区别

sleep想必都知道,作用是让进程挂起一段时间,参数是秒。但是很羞愧,对于usleep,我居然想当然以为是解除进城挂起,作为对自己的的惩罚,特意写下这篇文章。

在iOS中 如果 在主线程中用这2个 都会 对 主线程 造成 阻塞


函数名:** sleep**
头文件: #include <windows.h> // 在VC中使用带上头文件,或#include <unistd.h> // 在gcc编译器中,使用的头文件因gcc版本的不同而不同
功 能: 执行挂起指定的秒数
语 法: unsigned sleep(unsigned seconds);


函数名:** usleep**
头文件: #include <unistd.h>
功 能: usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒);
语 法: void usleep(int micro_seconds);
返回值: 无
内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。
注 意:
这个函数不能工作在windows 操作系统中。用在Linux的测试环境下面。 参 见:usleep() 与sleep()类似,用于延迟挂起进程。进程被挂起放到reday queue。 是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。 如果延迟时间为几十毫秒(1ms = 1000us),或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间

从上面引用网页的知识能得出关于usleep的几点:

  1. 功能与sleep类似,只是传入的参数单位是微妙
  2. 若想最佳利用cpu,在更小的时间情况下,选择用usleep
  3. sleep传入的参数是整形,所以不能传了小数
  4. usleep不能工作在windows上,只能在linux下(深深的体会到API对平台系统的严格要求,转念想想跨平台的语言是多么强大,多么爽啊,比如java)

usleep使用场景

MBProgressHUD demo中Moding switching模式中就用到了。代码如下:

- (void)doSomeWorkWithMixedProgress {
    MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view];
    // Indeterminate mode
    sleep(2);
    // Switch to determinate mode
    dispatch_async(dispatch_get_main_queue(), ^{
        hud.mode = MBProgressHUDModeDeterminate;
        hud.label.text = NSLocalizedString(@"Loading...", @"HUD loading title");
    });
    float progress = 0.0f;
    while (progress < 1.0f) {
        progress += 0.01f;
        dispatch_async(dispatch_get_main_queue(), ^{
            hud.progress = progress;
        });
        usleep(50000);
    }
    // Back to indeterminate mode
    dispatch_async(dispatch_get_main_queue(), ^{
        hud.mode = MBProgressHUDModeIndeterminate;
        hud.label.text = NSLocalizedString(@"Cleaning up...", @"HUD cleanining up title");
    });
    sleep(2);
    dispatch_sync(dispatch_get_main_queue(), ^{
        UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        hud.customView = imageView;
        hud.mode = MBProgressHUDModeCustomView;
        hud.label.text = NSLocalizedString(@"Completed", @"HUD completed title");
    });
    sleep(2);
}

代码中usleep(50000)换成sleep显然体验是非常不好的,回头可以自己改改试试。

MBProgressHUD demo

附:

时钟换算:
微秒,时间单位,符号us(英语:microsecond ).
1微秒等于百万分之一秒(10的负6 次方秒)
0.000 001 微秒 = 1皮秒
0.001 微秒 = 1纳秒
1,000 微秒 = 1毫秒
1,000,000 微秒 = 1秒
1s = 1000ms
1ms = 1000μs
1μs = 1000ns
1ns = 1000ps
1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)



作者:普度千言
链接:https://www.jianshu.com/p/ccdb9be5c6ef
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @   brave-sailor  阅读(1492)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2017-09-07 使用 Swift 3.0 操控日期
2017-09-07 Android定时任务
2016-09-07 Android Studio 完美修改应用包名
2015-09-07 android ListView和GridView拖拽移位实现代码
2015-09-07 Android ListView 单条刷新方法实践及原理解析
点击右上角即可分享
微信分享提示