2014-02-20 2 views
0

Я давно знаю, что нити имеют отдельное пространство стека, но разделяют кучу памяти.Значимость отдельного пространства стека для потоков

Но я недавно нашел код, который заставлял меня задавать вопрос именно то, что это значило.
Вот сокращенный вариант кода:

void SampleFunction() 
{ 
    CRemoteMessage rmessage; 
    rMessage.StartBackgroundAsync(); // Kickoff a background thread. 

    /* Do other long-running work here... 
    * but don't leave function SampleFunction 
    */ 

    rMessage.GetReply(); // Blocks if needed, but the message-background is mostly done by now. 
    rMessage.ProcessReply(); 
} 

В этом коде rmessage является локальным, стек переменной, но проводит большую часть своего времени в фоновом потоке. Это безопасно? Как именно фоновый поток может получить доступ к переменной стека этого потока?

+0

Что значит «как»? Ваш CPU реализует чтение памяти, вот как ... –

+0

Это безопасно. Класс использует указатель * this * для доступа к объекту в кадре стека. –

ответ

1

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

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

1

Я думаю, что путаница здесь заключается в том, что вы думаете о стеке потока как отдельном объекте, к которому можно получить доступ только одним потоком. Это не так.

Каждый процесс имеет один большой объем памяти для ее использования и каждый нить может читать (и писать!) все в этом пространстве; разделение на стек-пространство и кучу - это решение более высокого уровня. Для фонового потока не имеет значения, будет ли полученная память распределена в стеке другого потока или в куче.

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

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