Являются ли статические встроенные функции потокобезопасными?

#c #multithreading #thread-safety

#c #многопоточность #Потокобезопасность

Вопрос:

Сценарий: я написал большой фрагмент кода, работающий в 2 параллельных потоках, которые идентичны с точки зрения кода и просто обрабатывают разные данные. Я вижу недетерминированные результаты. Если я отключу один из 2 потоков, результаты станут детерминированными. В этом коде я использую некоторые статические встроенные функции (основная причина: это небольшие функции, которые мне нужны здесь и там, для которых я просто дублирую код в единицах перевода, где они необходимы), и я хотел бы понять, могут ли они быть возможной причиной моей проблемы.

Являются ли статические встроенные функции потокобезопасными в C? Сказано наоборот, если внутри них нет статической переменной, а есть только некоторые локальные переменные и входные параметры, вызовет ли одновременный вызов из 2 потоков непредсказуемое поведение?

Комментарии:

1. То, что не является потокобезопасным, может измениться. Код не меняется (при обычных обстоятельствах), но переменные часто меняются.

Ответ №1:

Нет, это действительно должно быть хорошо.

Независимо от того, является ли функция встроенной или нет, это не должно влиять на это, поскольку в любом случае это всего лишь код.

Является ли поведение недетерминированным с точки зрения фактических данных в памяти (результатов) или «просто» таких вещей, как время и порядок событий?

Возможно, вы записываете в параметры, случайно создавая гонку данных?

Комментарии:

1. Результаты разные. Я пишу в параметрах, но они имеют разные адреса для 2 потоков или адреса переменных, локальных для другой функции, поэтому я думаю, что это должно быть безопасно. У вас есть краткий пример кода, который может привести к скачку данных?

2. «Адреса переменных, локальных для другой функции»? Надеюсь, это не функция, которая является родительской для потоков? Это, конечно, сделало бы адрес одинаковым в обоих потоках. Но здесь я просто слепо блуждаю в темноте, очевидно.

3. @Antonio у вас могут быть условия гонки, которые запускаются по-разному, когда вы вставляете код, потому что, если код встроен, он может быть немного быстрее, и поэтому условия гонки могут запускаться по-разному.

4. @MichaelWalz Я не понимаю вашего заявления. В моем случае потоки совместно используют только код, а не данные, и я не вижу, какая возможная гонка может быть запущена.

5. @Antonio Хорошо, я кое-что неправильно понял. Не обращайте внимания на комментарий.

Ответ №2:

Являются ли статические встроенные функции потокобезопасными в C?

ДА. Статические встроенные функции не влияют на потокобезопасность. Но если вы используете статические переменные, тогда вы должны быть осторожны.

если внутри них нет статической переменной, а есть только некоторые локальные переменные и входные параметры, вызовет ли одновременный вызов из 2 потоков непредсказуемое поведение?

Если вы используете локальную переменную, у вас не возникнет никаких проблем. Потому что у каждого потока есть своя собственная память стека.