Установка глобальных переменных в потоке - PullRequest
3 голосов
/ 12 мая 2011

Мне нужно иметь строку в качестве глобальной переменной.Существует возможность для нескольких потоков установить глобальную переменную.Должен ли я пойти на мьютекс для этого?Или ОС будет обрабатывать такие действия.Переход на мьютекс влияет на производительность приложения.

Меня не беспокоит порядок действий.Я боюсь повреждения данных.Может ли кто-нибудь сообщить мне об этом.

Ответы [ 4 ]

1 голос
/ 12 мая 2011

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

0 голосов
/ 12 мая 2011

Что касается стандартов, да, вы должны использовать мьютекс.Невыполнение этого требования приводит к неопределенному поведению.На практике большинство машинных архитектур не будет иметь проблем с этим.Будущие версии стандарта C (C1x) будут иметь атомарные типы, которые, если их использовать здесь, определенно сделают назначение без блокировки безопасным (хотя, возможно, с использованием внутренней блокировки, на сломанных дугах, в которых отсутствует настоящая атомика).

0 голосов
/ 12 мая 2011

Для этого можно использовать Локальное хранилище потока .
К сожалению, оно не указано в текущем стандарте C99, но возможно будет в C1X.На данный момент вы можете использовать специфичные для компилятора реализации (GCC, ICC и Visual C имеют его).

0 голосов
/ 12 мая 2011

Какая у вас глобальная переменная? Указатель на строковый буфер или сам буфер?

На многих архитектурах (включая 32-битный x86 AFAIR) перезапись одного указателя является атомарной.

Этот пример может работать:

volatile char **global_var;

void set_var(char *str) {
    char *tmp = strdup(str);
    global_var = &tmp;
}
...