我需要使用用户空间线程库中的nanosleep
函数来实现大致所需的等待量,因为它可以在异步信号中断的情况下节省剩余时间。我使用SIGALRM来抢先切换线程;因此,考虑使用不可重入函数可能产生的副作用是很重要的。因此,如果nanosleep
调用被线程开关中断,并且从另一个线程或信号处理程序再次调用,我想知道这种情况是否会导致问题。
显然,nanosleep
函数不是异步信号安全的,因为这里没有列出它;然而,sleep(3)
被认为是异步信号安全的。另一方面,sleep(3)
似乎是在Linux上使用nanosleep
实现的。我能把这作为nanosleep
对我试图实现的目标是安全的证据吗?
编辑:根据这个资源,它确实是安全的。
不,除非有专门的文档,否则不能安全地假设这一点。原因是使用nanosleep
是sleep
的一个实现细节。如果这两个函数被重构为使用glibc中一些常见的内部函数,这些函数是异步信号安全的,但nanosleep
的实现发生了变化,所以它不是,那么代码就会被破坏。
您不能依赖glibc中函数的实现细节,因为它们可以而且确实会跨版本更改。值得注意的是,由于glibc将memcpy
更改为向下复制,而不是向上复制,所有Adobe Flash版本在某些机器上都崩溃了,这是标准和文档允许的。
此外,仅仅因为glibc以某种方式做事并不意味着其他Linux libc会这样做(或其他非Linux libc(,并且您的代码在那里不起作用。