Поддерживает ли локальная переменная в функции потока отдельную копию в соответствии с потоком?

Я объявил некоторую локальную переменную в одной функции следующим образом:

void* thread_function (void* parameter)
{
   struct parameter * thread_data = (struct parameter *)parameter;
   char buffer[20];
   int temp;
}

Здесь, если я создал два потока, то в одном потоке, если буфер и temp обновлены, так что это повлияет на другой поток?

Я имею в виду, если есть два потока, тогда будет ли две копии всей локальной переменной?

EDIT: тогда в этом случае мне нужно использовать данные, специфичные для потока.? я имею в виду pthread_setspecific и все такие вещи

Ответ 1

Эти переменные выделяются в стеке, и каждый поток имеет свой собственный стек: эти переменные являются частными для каждого потока (они не разделены). (Подробнее см. этот ответ.)

Если вы назначаете thread_data глобальному указателю, например, другие потоки смогут получить доступ к thread_data с помощью глобального указателя.

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

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

Ответ 2

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

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

Это делает явным, что каждый вызов должен иметь собственное хранилище для автоматических переменных.

Ответ 3

Локальные переменные хранятся в памяти стека, которая является частной для потока.

Поэтому они не разделяются между потоками: в каждом потоке будет независимая копия каждой переменной

Обновление Независимо от того, хотите ли вы делиться данными между потоками, действительно зависит от дизайна вопроса; Каковы твои потоки? Согласованы ли их усилия или просто рабочие обрабатывают очередь.

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