一个 C 库中线程安全的澄清

3
有没有人能为我澄清一下以下代码段是否具有线程安全性?
int get_time(uint64_t *time)
{
    struct timespec spec;
    if (!time)
        return -EFAULT;
    if (clock_gettime(CLOCK_REALTIME, &spec) == -1)
        return -errno;
    *time = //convert timespec into nanoseconds
    return SUCCESS;
}

这是一个库中可由多个线程调用的API。规范是一个局部变量,所以不应该存在问题。正确吗?我的疑问在于clock_getime(POSIX.1-2001)和对时间参数的赋值。我想引入一个互斥锁,但我不确定是否严格需要。


1
我没有看到任何好的理由来认为这个函数不是线程安全的。虽然我找不到相关的参考资料,但是clock_gettime()为什么会不支持多线程呢? - Iharob Al Asimi
1个回答

8
您的代码中仅使用自动变量,且唯一的函数调用(clock_gettime)本身就是线程安全的,因此答案是:
是的,它是安全的。 POSIX规范中写道:

3.396 线程安全

可以被多个线程同时安全调用的函数。IEEE Std 1003.1-2001系统接口卷中定义的每个函数除非另有明确说明,否则均为线程安全。例如任何“纯”函数、在访问静态存储或线程间共享对象时保持互斥锁定的函数。

该函数规范中没有列出任何异常:
http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html

谢谢。我的疑惑关于clock_gettime是因为我在man页面中找到了它符合POSIX.1-2001的规范,并阅读了这篇白皮书http://www.unix.org/whitepapers/reentrant.html。可能我理解有误。 - IWill80
我的错...白皮书是关于可重入性,而不是线程安全性。谢谢。 - IWill80
当然它不是线程安全的,对time的赋值需要一个锁。你如何防止线程同时读写time? - 4pie0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接