Значение отдельного стекового пространства для потоков

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
    Что значит "как"? Ваш процессор реализует чтение памяти, вот как ...
  • 0
    Это безопасно. Класс использует указатель this для доступа к объекту в кадре стека.
Теги:
multithreading

2 ответа

1

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

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

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

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню