2

我需要nanosleep在我的用户空间线程库中使用该函数来实现大约所需数量的等待,因为它可以在异步信号中断的情况下节省剩余时间。我使用 SIGALRM 抢先切换线程;因此,重要的是要考虑使用不可重入函数的可能副作用。出于这个原因,如果一个nanosleep调用被线程切换中断并且从另一个线程或信号处理程序再次调用它,我想知道这种情况是否会导致问题。

显然,nanosleep函数不是异步信号安全的,因为它没有在此处列出;但是,sleep(3)据说是异步信号安全的。另一方面,sleep(3)似乎是nanosleep在 Linux 上使用实现的。我可以将此作为nanosleep对我想要实现的目标安全的证据吗?

编辑:根据这个资源,它确实是安全的。

4

1 回答 1

2

不,除非有专门记录,否则您不能安全地假设这一点。原因是 usingnanosleepsleep. 如果这两个函数被重构为使用 glibc 中的一些常见的内部函数,这些函数是异步信号安全的,但nanosleep' 的实现发生了变化,因此它不是,你的代码就会被破坏。

您不能依赖 glibc 中函数的实现细节,因为它们可以并且确实会跨版本更改。值得注意的是,所有 Adob​​e Flash 版本在某些机器上都崩溃了,因为 glibc 更改memcpy为向下复制而不是向上复制,这是标准和文档所允许的。

此外,仅仅因为 glibc 以某种方式做事并不意味着其他 Linux libcs​​ 做(或其他非 Linux libcs​​),并且您的代码不会在那里工作。

于 2020-04-03T20:34:47.543 回答