【问题标题】:nanosleep() never "wakes up" on OS X Lionnanosleep() 在 OS X Lion 上永远不会“唤醒”
【发布时间】:2026-02-16 08:35:01
【问题描述】:

我在 Lion 中使用 XCode 4.2。当我使用调试配置文件(按 Apple+R 运行它)编译我的应用程序时,当我调用 nanosleep 时,它永远不会从该函数返回。曾经。如果我分析代码(构建发布配置文件),那么它会返回。我只是使用 XCode 项目的默认配置文件设置。知道这里可能发生了什么吗?

要重现这一点,请创建一个全新的空白应用程序并将以下代码放入 appDelegate.m:

#import "AppDelegate.h"
#import <time.h>

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"Hello");
    struct timespec a;
    a.tv_nsec = 10000;

    /** THE FIX! **/
    a.tv_sec = 0;
    /** THE FIX! **/

    nanosleep(&a,NULL);
    NSLog(@"World");
}

@end

预期行为:在 Hello 后 0.01 毫秒将“World”打印到调试控制台。

实际行为:仅打印“Hello”且不显示任何窗口。

【问题讨论】:

  • 也许你想发布一些代码?
  • 当然,我已经添加了代码和最小说明来重现这个问题。

标签: objective-c macos osx-lion xcode4.2 time.h


【解决方案1】:

尝试将 a.tv_sec 显式设置为 0。可能它被初始化为一些垃圾并让 nanosleep 休眠很长时间。


或者,你可以use usleep

#include <unistd.h>

...

NSLog(@"Hello");
usleep(10);      // 0.010 ms = 10 µs = 10000 ns
NSLog(@"World");

【讨论】:

    【解决方案2】:

    您的结构是在堆栈上分配的,因此您可能有垃圾/剩余数据。

    由于timespec 结构也有一个tv_secmember,你也应该将它设置为0:

    struct timespec a;
    
    a.tv_sec  = 0;
    a.tv_nsec = 10000;
    
    nanosleep( &a, NULL );
    

    【讨论】: