gpt4 book ai didi

objective-c - 为什么 usleep 不起作用?

转载 作者:行者123 更新时间:2023-12-03 16:54:54 25 4
gpt4 key购买 nike

我有一个正在单独的队列/线程上运行的函数。在此函数中,我尝试调用 usleep

无论传入的值是什么,usleep 似乎都不起作用。 sleep() 也是如此。

为了诊断错误,我打印了 errnoerrno 打印为:“中断的系统调用”

这到底是什么意思,我该如何诊断它?

手册页将错误描述为:

[EINTR]            A signal was delivered to the process and its action was to invoke a signal-catching
function.

注意我在 OSX Mountain Lion 上使用 Xcode 4 并使用 Objective-C。我正在使用 Cocoa 为 OSX 开发一个应用程序。

最佳答案

usleepsleep可以通过信号的传递以这种方式中断。

没有专用的信号传递线程,因此信号可以传递到应用程序中的任意线程。

注意下面留下的原始答案在 Mountain Lion 上无法正常工作 - 在 XCode 下运行时有其他东西触发 EINTR。

为了避免这个问题,我们切换到 nanosleep ,并利用当它被中断时它在第二个参数中返回剩余时间的事实:

struct timespec to_sleep = { 1, 0 }; // Sleep for 1 second
while ((nanosleep(&to_sleep, &to_sleep) == -1) && (errno == EINTR));

不过,如果您使用 NSThread,那么最好使用:

[NSThread sleepForTimeInterval:1.0f]; // sleep for 1 second

这是 cocoa 的 sleep 方式,并且不会遭受 sleep 那样的“打嗝”之苦。 , usleepnanosleep经验

旧答案 - 在调试器下无法正常工作。

如果您想阻止具有您的 usleep 的线程为了避免被中断,您需要屏蔽所有可能传递到线程的信号。例如

#include <signal.h>

sigset_t sigset;
sigset_t oldset;
sigfillset(&sigset);
pthread_sigmask(SIG_BLOCK, &sigset, &oldset);
usleep(9999);
pthread_sigmask(SIG_SETMASK, &oldset, NULL);

注意:此代码中未进行错误检查

关于objective-c - 为什么 usleep 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com