我听说有些unix实现使用alarm(2)
来实现sleep
函数。
如果确实如此,我想下面的代码可能不安全,因为SIGALRM
可能会被发送到进程,这是由根线程接收的。
#include <pthread.h>
#include <unistd.h>
void *doit(void *arg) {
sleep(1);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t th;
pthread_create(&th, NULL, doit, NULL);
sleep(5);
pthread_join(th, NULL);
return 0;
}
在线程中调用sleep(3)
,usleep(3)
或nanosleep(2)
是否安全?
答案 0 :(得分:0)
我不知道你在一个帖子中使用sleep()的目的是什么,但我从不建议其他人这样做。如果要测量特定时间,可以使用应用程序计时器。例如,如果要控制所有线程的运行顺序,可以使用pthread_cond。 Linux还提供了许多方法来允许您同步线程。
快速浏览一下“男人3睡觉”,给出以下答案。 “ BUGS sleep()可以使用SIGALRM实现;混合呼叫报警(2)和睡眠()是一个坏主意。 使用信号处理程序中的longjmp(3)或在睡眠时修改SIGALRM的处理将导致未定义的结果。
与sleep(3)和usleep(3)相比,nanosleep()具有以下优点:它提供了更高的分辨率来指定 睡眠间隔; POSIX.1明确指出它不与信号交互;它使恢复睡眠的任务成为可能 已经被信号处理程序更容易打断了。 “