2014-09-17 7 views
1

Насколько я знаю, в многопоточных приложениях каждый поток имеет свой собственный отдельный стек и разделяет кучу с другими. Итак, мне было интересно, является ли это функцией языка, компилятора или OS-depenadent? Являются ли все многопоточные приложения такими?Общие переменные в многопоточных программах

Мой второй вопрос: есть ли общая переменная среди потоков, она создана в куче или нет? Есть ли другой способ обмена переменной между потоками, кроме как с помощью кучи?

ответ

2

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

Общие переменные хранятся в памяти кучи. Тем доля переменных, используя кучу только .. очевидно, что это не единственный способ обмена данными , Есть сигналы, обратные вызовы и многие другие методы ...

+0

Итак, это означает, что если я определяю общую переменную в pythma openmp, она переводится в malloc() ?? – user3684042

+0

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

2

Каждый поток будет иметь собственную память стека, которая является функцией ОС. Все многопоточные приложения любят и следуют той же функции.

Мой второй вопрос в том, есть ли общая переменная среди потоков, это , созданный в куче или нет? Есть ли другой возможный способ обмена переменной среди потоков, за исключением кучи?

В соответствии с Java нет другого способа обмена переменной, но с помощью кучи.

+0

Я сомневаюсь, что в документе Java это так. Память не просто разделяется между стеком (ов) и кучей (ями). Подумайте о статической и общей переменной, вы сказали бы, что она выделена на кучу JIT (при условии, что она отличается от кучи (ов))? Скажете ли вы, что буфер файла, выделенный ядром, живет на куче ядра? –

2

Я хотел бы также сказать стек зависит от операционной системы

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

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

Смежные вопросы