Статическая переменная обычно означает, что несколько вызовов вашей функции будут совместно использовать состояние и, таким образом, создавать помехи друг другу.
Обычно вы хотите, чтобы ваши функции были автономными; иметь локальные копии всего, с чем они работают, и ничего не делить с параметрами внешнего мира и возвращаемыми значениями. (Которые, если вы думаете определенным образом, в любом случае не являются частью функции.)
Рассмотрим:
int add(int x, int y);
определенно поточно-ориентированные локальные копии x и y.
void print(const char *text, Printer *printer);
опасно, кто-то снаружи может что-то делать с тем же принтером, например вызывая другую печать () на нем.
void print(const char *text);
определенно не поточнобезопасный, два параллельных вызова гарантированно используют один и тот же принтер.
Конечно, есть способы обеспечить доступ к общим ресурсам (ключевое слово для поиска: mutex
); именно так должно быть ваше внутреннее чувство.
Несинхронизированные параллельные записи в переменную в большинстве случаев также не являются потокобезопасными, как и чтение и запись. (ключевые слова для поиска: synchronization
, synchronization primitives
[из которых mutex
является только одним], а также atomicity
/ atomic operation
для случаев, когда параллельный доступ безопасен.)