2013-06-24 3 views
0

Как управлять кучей в многопоточной среде?Куча в многопоточной среде

  • Разделен ли он между нитями или каждый поток имеет свою независимую кучу?
  • Если возможны оба варианта, то какой рекомендуемый подход?

enter image description here

+0

в какой ОС? Какой язык? Какая среда выполнения? –

+1

Проверьте [это] (http://stackoverflow.com/questions/1665419/do-threads-have-a-distinct-heap) тоже –

ответ

2

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

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

+0

+1 - не хотели бы использовать частные кучи - «волосатые»? Страшно! –

+0

На самом деле частные кучи - неплохая идея. Следствием этого является то, что вы не можете обмениваться памятью между потоками. Затем вам придется делиться данными через явные IPC (трубы и т. Д.). Это становится больше похожим на CSP, что является хорошим способом избежать взаимоблокировки, livelock и т. Д. Так что не такая плохая идея ... – bazza

+0

Да, это правда. Темы в традиционном смысле имеют доступ к данным друг друга, но если вы удалите это требование, вы можете сделать вещи намного чище. – Minthos

1

Говоря о pthreads,

С man page,

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

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

void* thFn(void*) 
{ 
    char* c = new char[5]; 
    //etc 
    delete[] c; 
} 

В этом случае память будет выделена в куче. Но c является локальным для каждого pthread. Другое pthreads может считывать данные из этого места (получение правильных значений, пока память не будет выделена потоком, который его выделил), если им разрешено (если они каким-то образом получили адрес).