Разъяснение безопасности потоков в библиотеке a c

Может кто-нибудь уточнить мне, является ли следующий фрагмент кода безопасностью потоков?

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) и назначения аргумента time. Я хотел бы ввести мьютекс, но я не уверен, строго ли это необходимо.

1 ответ

Решение

Вы не используете ничего, кроме автоматических переменных в вашем коде, и единственный вызов функции (clock_gettime) по своей сути потокобезопасен, поэтому ответ таков:

Да, это безопасно.

Из спецификации POSIX:

3.396 Потокобезопасный

Функция, которая может безопасно вызываться одновременно несколькими потоками. Каждая функция, определенная в томе "Системные интерфейсы" стандарта IEEE Std 1003.1-2001, является поточно-ориентированной, если не указано иное. Примерами могут служить любая "чистая" функция, функция, которая удерживает мьютекс заблокированным во время доступа к статическому хранилищу, или объекты, совместно используемые потоками.

В спецификации для этой функции нет исключений:
http://pubs.opengroup.org/onlinepubs/009695399/functions/clock_getres.html

Другие вопросы по тегам