作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我听说一些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)
是否安全?
最佳答案
我不知道你在线程中使用 sleep() 的目的是什么,但我从不推荐其他人这样做。如果你想测量某个时间,你可以使用应用程序定时器。例如,如果你想控制所有线程的运行顺序,你可以使用pthread_cond。 Linux 还提供了许多方法来让您同步线程。
快速浏览一下“man 3 sleep”,它给出了以下答案。“漏洞 sleep() 可以使用 SIGALRM 实现;混合调用 alarm(2) 和 sleep() 是个坏主意。 从信号处理程序使用 longjmp(3) 或在休眠时修改 SIGALRM 的处理将导致未定义的结果。
与 sleep(3) 和 usleep(3) 相比,nanosleep() 具有以下优点:它提供了更高的分辨率来指定 sleep 间隔; POSIX.1 明确规定它不与信号交互;它使恢复 sleep 的任务 更容易被信号处理程序中断。 "
关于linux - 在线程中调用 sleep(3)、usleep(3) 或 nanosleep(2) 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162521/
我是一名优秀的程序员,十分优秀!