我有一个正在单独的队列/线程上运行的函数。在此函数中,我尝试调用usleep
。
无论传入的值如何,usleep
似乎都不起作用。 sleep()
也是如此。
为了诊断错误,我打印了errno
。 errno
打印为:“系统调用中断”
这到底是什么意思,我该如何诊断呢?
手册页将错误描述为:
[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应用程序。
最佳答案
usleep
和sleep
可以通过传递信号来中断。
没有专用的信号传递线程,因此可以将信号传递到应用程序中的任意线程。
注意:下面留下的原始答案在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
这是可可的睡眠方式,不会受到
sleep
,usleep
和nanosleep
经历的“打ic”旧答案-在调试器下无法正常工作。
如果要防止
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 - 为什么不 sleep 呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12239866/