2016-10-19 2 views
0

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

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

+0

Вещи, которые не являются потокобезопасными, - это вещи, которые могут измениться. Код не изменяется (при нормальных обстоятельствах), но переменные часто делают. – xaxxon

ответ

2

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

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

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

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

+0

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

+0

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

+0

Нет, этого не должно быть. Я должен еще раз исследовать ... – Antonio

0

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

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

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

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