在线程中调用sleep(3),usleep(3)或nanosleep(2)是否安全?

时间:2014-03-04 03:50:50

标签: linux multithreading unix pthreads

我听说有些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)是否安全?

1 个答案:

答案 0 :(得分:0)

我不知道你在一个帖子中使用sleep()的目的是什么,但我从不建议其他人这样做。如果要测量特定时间,可以使用应用程序计时器。例如,如果要控制所有线程的运行顺序,可以使用pthread_cond。 Linux还提供了许多方法来允许您同步线程。

快速浏览一下“男人3睡觉”,给出以下答案。 “ BUGS        sleep()可以使用SIGALRM实现;混合呼叫报警(2)和睡眠()是一个坏主意。        使用信号处理程序中的longjmp(3)或在睡眠时修改SIGALRM的处理将导致未定义的结果。

与sleep(3)和usleep(3)相比,nanosleep()具有以下优点:它提供了更高的分辨率来指定        睡眠间隔; POSIX.1明确指出它不与信号交互;它使恢复睡眠的任务成为可能        已经被信号处理程序更容易打断了。 “