Накладные расходы на локальное хранилище потока

Предположим, есть какая-то нереентерабельная функция, которая использует глобальные переменные:


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 */
}

Спасибо.

6
задан VividD 5 September 2016 в 00:01
поделиться