Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Доступ множества потоков к одной функции


Автор: EnergoHokum 19.2.2008, 11:22
В продолжение серии "про многопоточность". smile Возникло непонимание в таком вопросе: Предположим, имеется некая функция, не содержащая обращений к "внешним" данным. В системе несколько процессоров, т. е. несколько потоков могут одновременно или с крайне незначительным перекрытием по времени обратиться к этой функции. Разумеется, они ей что-нить передадут (через указатели), разумеется, функция изменит как свои внутренние переменные, так и переменные потоков. Вопрос, собственно, в следующем: для каждого потока создастся "персональный образ" этой функции, или поток T1 изменит в функции переменную Var, и поток T2 прочитает уже изменённый вариант Var?
Изложил несколько коряво, но я сам пока не могу кристально чисто сформулировать, что мне не нравится, просто "меня терзают смутные сомнения"...

Автор: MAKCim 19.2.2008, 11:28
EnergoHokum, 
локальные нестатические переменные функции располагаются в стеке, а стек для каждого потока разный
поэтому изменение какой-либо переменной в контексте вызова функции одним потоком никак не влияет на изменение переменной в контексте вызова функции другим потоком
естественно, все параметры должны передаваться в функцию по значению или по указателю, но быть при этом прямо или косвенно TLS-данными

Автор: Lazin 19.2.2008, 11:29
да, если это статические переменные функции...

Автор: EnergoHokum 19.2.2008, 11:35
Спасибо, вопрос закрыт!

Автор: MAKCim 19.2.2008, 11:38
Цитата(Lazin @  19.2.2008,  11:29 Найти цитируемый пост)
да, если это статические переменные функции... 

они могут быть статическими TLS-переменными

Автор: Lazin 19.2.2008, 11:51
Цитата(MAKCim @  19.2.2008,  11:38 Найти цитируемый пост)
они могут быть статическими TLS-переменными 

сами по себе они такими не станут, это нужно сначала компилятору объяснить)) 

Автор: EnergoHokum 19.2.2008, 11:53
А насколько оправдано (плюсы/минусы) использование этих TLS-переменных в живом проекте (т. е. не "лабораторные условия")?

Автор: MAKCim 19.2.2008, 12:07
Цитата(EnergoHokum @  19.2.2008,  11:53 Найти цитируемый пост)
А насколько оправдано (плюсы/минусы) использование этих TLS-переменных в живом проекте (т. е. не "лабораторные условия")? 

если есть в них потребность, то оправдано
если размер (и возможно значение) данных известен на этапе компиляции/компоновки, то лучше применять статическую модель TLS (__thread, __declspec(thread)), т. к она более эффективна и быстра, нежели использование специального API для работы с динамической моделью TLS
как пример необходимости использования переменной TLS - переменная errno в libc

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)