Создание глобальных мультиориентированных на многопотоковое исполнение статических переменных

У меня есть глобальные статические переменные в библиотеке C, которые генерируют исключения в выполненном мультипотоке. Я должен сделать их безопасными в некотором роде (т.е. каждый поток должен коснуться различного экземпляра этих переменных). Какие-либо рекомендуемые методы?

6
задан Donal Fellows 18 April 2010 в 14:44
поделиться

3 ответа

Не существует стандартного способа, который работал бы во всех реализациях C, но существуют решения для конкретных реализаций. Например, с компилятором Microsoft (см. документацию ),

__declspec( thread ) int tls_i = 1;

заставляет tls_i жить в локальном хранилище потока (каждый поток имеет свой собственный отдельный экземпляр этой переменной). Для gcc синтаксис

__thread int tls_i;

Вы также можете проверить запись в википедии по этой теме.

10
ответ дан 8 December 2019 в 12:58
поделиться

У большинства компиляторов есть способ обозначить локальное хранилище потока. Предполагая, что он доступен, это то, что вы хотите.

1
ответ дан 8 December 2019 в 12:58
поделиться

Первый вопрос:

  • нужны ли потокам собственные копии переменных?
  • или они должны координировать доступ к одной общей копии?

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

Если вам нужно второе, то так или иначе вам нужно обеспечить наличие соответствующего мьютекса на этих переменных (область действия мьютекса - один из вопросов, с которыми вы столкнетесь), и чтобы все потоки использовали мьютекс и освобождали его. Это сложнее. Может даже оказаться, что вам потребуется предоставить функции, контролирующие доступ к переменным.

Стандартная переменная errno может быть изменяемым l-значением:

extern int *_errno_func(void);
#define errno (*(_errno_func)())

В приложении с потоками (скомпилированном с -DREENTRANT) так и происходит; на MacOS X, похоже, так и происходит (они используют имя __error вместо _errno_func; оба находятся в пространстве имен реализации).

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

4
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: