#c #multithreading #thread-safety
#c #многопоточность #Потокобезопасность
Вопрос:
Сценарий: я написал большой фрагмент кода, работающий в 2 параллельных потоках, которые идентичны с точки зрения кода и просто обрабатывают разные данные. Я вижу недетерминированные результаты. Если я отключу один из 2 потоков, результаты станут детерминированными. В этом коде я использую некоторые статические встроенные функции (основная причина: это небольшие функции, которые мне нужны здесь и там, для которых я просто дублирую код в единицах перевода, где они необходимы), и я хотел бы понять, могут ли они быть возможной причиной моей проблемы.
Являются ли статические встроенные функции потокобезопасными в C? Сказано наоборот, если внутри них нет статической переменной, а есть только некоторые локальные переменные и входные параметры, вызовет ли одновременный вызов из 2 потоков непредсказуемое поведение?
Комментарии:
1. То, что не является потокобезопасным, может измениться. Код не меняется (при обычных обстоятельствах), но переменные часто меняются.
Ответ №1:
Нет, это действительно должно быть хорошо.
Независимо от того, является ли функция встроенной или нет, это не должно влиять на это, поскольку в любом случае это всего лишь код.
Является ли поведение недетерминированным с точки зрения фактических данных в памяти (результатов) или «просто» таких вещей, как время и порядок событий?
Возможно, вы записываете в параметры, случайно создавая гонку данных?
Комментарии:
1. Результаты разные. Я пишу в параметрах, но они имеют разные адреса для 2 потоков или адреса переменных, локальных для другой функции, поэтому я думаю, что это должно быть безопасно. У вас есть краткий пример кода, который может привести к скачку данных?
2. «Адреса переменных, локальных для другой функции»? Надеюсь, это не функция, которая является родительской для потоков? Это, конечно, сделало бы адрес одинаковым в обоих потоках. Но здесь я просто слепо блуждаю в темноте, очевидно.
3. @Antonio у вас могут быть условия гонки, которые запускаются по-разному, когда вы вставляете код, потому что, если код встроен, он может быть немного быстрее, и поэтому условия гонки могут запускаться по-разному.
4. @MichaelWalz Я не понимаю вашего заявления. В моем случае потоки совместно используют только код, а не данные, и я не вижу, какая возможная гонка может быть запущена.
5. @Antonio Хорошо, я кое-что неправильно понял. Не обращайте внимания на комментарий.
Ответ №2:
Являются ли статические встроенные функции потокобезопасными в C?
ДА. Статические встроенные функции не влияют на потокобезопасность. Но если вы используете статические переменные, тогда вы должны быть осторожны.
если внутри них нет статической переменной, а есть только некоторые локальные переменные и входные параметры, вызовет ли одновременный вызов из 2 потоков непредсказуемое поведение?
Если вы используете локальную переменную, у вас не возникнет никаких проблем. Потому что у каждого потока есть своя собственная память стека.