Предположим, есть какая-то нереентерабельная функция, которая использует глобальные переменные:
int i;
void foo(void){
/* modify i */
}
И затем я хочу использовать это функция в многопоточном коде, поэтому я могу изменить код следующим образом:
void foo(int i){
/* modify i */
}
или, используя спецификатор gcc __thread, более простой:
__thread int i;
void foo(void){
/* modify i */
}
Преимущества последнего в том, что мне не нужно изменять другой код, который вызывает foo () .
У меня такой вопрос: сколько накладных расходов на локальное хранилище потоков? Есть ли какие-то неочевидные проблемы с TLS?
Есть ли дополнительные расходы, если я изменю переменную TLS с помощью отдельного указателя, например:
__thread int i;
void foo(void){
int *p = &i;
/* modify i using p pointer */
}
Спасибо.