Имеет ли локальная переменная в функции потока отдельную копию в соответствии с потоком? - PullRequest
11 голосов
/ 12 сентября 2011

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

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

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

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

РЕДАКТИРОВАТЬ: тогда в каком случае мне нужно использовать данные, специфичные для потока.?я имею в виду pthread_setspecific и все такое прочее

Ответы [ 3 ]

12 голосов
/ 12 сентября 2011

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

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

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

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

7 голосов
/ 12 сентября 2011

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

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

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

2 голосов
/ 12 сентября 2011

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

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

Обновление Хотите ли вы обмениваться данными между потоками, все сводится к вопросу разработки;Что делают ваши темы?Скоординированы ли их усилия или они просто рабочие, обрабатывающие очередь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...