2014-02-07 2 views
6

Я разрабатываю многопоточную программу на C++ с Pthread, где мне нужно выделить локальную память в каждом потоке. После googling я нашел тип pthread_key_t, который представляет собой некоторую карту, которая позволяет вам выделять память в TLS.pthread_key_t vs local variable

Итак, мой вопрос в чем разница между локальной переменной в функции потока и pthread_key_t? И можете ли вы дать правильный пример использования pthread_key_t?

ответ

2

Разница между локальным хранилищем данных и локальными переменными заключается в том, что локальное хранилище потоков не обязательно должно быть локальным для функции. Обычные локальные переменные могут быть недоступны, как только функция, объявляющая их, возвращается. Резервное хранилище, доступное с помощью pthread_getspecific и pthread_setspecific, может быть безопасно использовано после того, как функция, которая его создала, будет удалена.

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

+0

Спасибо. Я нашел этот ответ очень ясным, и вы очистили мои сомнения по этому поводу. Это было именно то, что я хотел знать –

1

Поскольку каждый поток имеет свой собственный стек, гораздо лучше, если каждый поток выделяет свои собственные переменные, если вам не нужно обмениваться данными между потоками. Для обмена данными используется pthread_key_ *.

Документация и небольшие примеры на http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_key_create.html.