У меня есть глобальные статические переменные в библиотеке C, которые генерируют исключения в выполненном мультипотоке. Я должен сделать их безопасными в некотором роде (т.е. каждый поток должен коснуться различного экземпляра этих переменных). Какие-либо рекомендуемые методы?
Не существует стандартного способа, который работал бы во всех реализациях C, но существуют решения для конкретных реализаций. Например, с компилятором Microsoft (см. документацию ),
__declspec( thread ) int tls_i = 1;
заставляет tls_i
жить в локальном хранилище потока (каждый поток имеет свой собственный отдельный экземпляр этой переменной). Для gcc синтаксис
__thread int tls_i;
Вы также можете проверить запись в википедии по этой теме.
У большинства компиляторов есть способ обозначить локальное хранилище потока. Предполагая, что он доступен, это то, что вы хотите.
Первый вопрос:
Если вам нужно первое, то в других ответах были предложения о "локальном хранении потоков".
Если вам нужно второе, то так или иначе вам нужно обеспечить наличие соответствующего мьютекса на этих переменных (область действия мьютекса - один из вопросов, с которыми вы столкнетесь), и чтобы все потоки использовали мьютекс и освобождали его. Это сложнее. Может даже оказаться, что вам потребуется предоставить функции, контролирующие доступ к переменным.
Стандартная переменная errno
может быть изменяемым l-значением:
extern int *_errno_func(void);
#define errno (*(_errno_func)())
В приложении с потоками (скомпилированном с -DREENTRANT) так и происходит; на MacOS X, похоже, так и происходит (они используют имя __error
вместо _errno_func
; оба находятся в пространстве имен реализации).
Возможно, вы захотите или в конечном итоге будете вынуждены сделать нечто подобное для своих переменных. Тот факт, что вы говорите, что они статические, немного улучшает ситуацию. Вам придется иметь дело только с одним файлом (если только вы не будете достаточно неосторожны, чтобы передавать обратно - или дальше - указатели на эти переменные).