Если вы собираетесь попробовать параллельное программирование, то я думаю, что clojure намного лучше, чем то, что вы получаете из Java из коробки. Взгляните на эту презентацию, чтобы понять, почему:
Я задокументировал свои первые 20 дней с Clojure в своем блоге.
http://loufranco.com/blog/files/category-20-days-of-clojure.html
Я начал с лекций SICP, а затем построил параллельное простое число сито. Я также играл с макросами.
Если вам просто нужен текущий размер стека, вы можете объявить переменную в верхней части main (), взять ее адрес и сравнить его с адресом переменной, объявленной в любом месте, где вы определяете "ток" быть. Разница должна быть приблизительным размером, который увеличился в стеке.
Если вы хотите знать, сколько памяти зарезервировано для стека, вы можете проверить / proc / [pid] / maps, где есть область, отмеченная как [stack ]. Например, мой процесс atd имеет:
7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]
, что дает вам представление.
Изящный трюк, которым поделился со мной друг, когда я хотел узнать максимальный размер стека, который использовала моя программа, был следующее. Я представлю его здесь на тот случай, если кто-то сочтет это полезным :)
1) В функции, вызываемой в начале main (), используйте alloca () или очень длинный массив для написания 0xDEADBEEF или какой-либо другой такой маловероятной константы в той части стека, которую вы ожидаете использовать. Эта память будет «освобождена», когда небольшая функция вернется.
2) В конце main снова используйте alloca (), чтобы захватить область памяти и «искать» в ней любую магическую константу, которую вы использовали для каракулей. (вы можете попытаться найти первый блок из 64 из них или что-то еще, чтобы пропустить области памяти, которые могли быть выделены, но просто никогда не использовались), и место, где находится этот указатель, указывает на максимальное использование стека.
Не идеально, но это было полезно для того, что я делал!
Как предположил Стивен, существует разница между размером стека, зарезервированным для вашего потока, и стеком, который в настоящее время используется вашим потоком.
Если вы хотите знать, сколько памяти зарезервировано для одного потока вы можете использовать атрибут pthread.
pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("%u\n", stacksize);
Будет напечатан размер стека по умолчанию, зарезервированный при создании одного потока. Для меня это 8 Мб.
Вы можете изменить это, используя pthread_attr_setstacksize () и передав структуру attr как 2 аргумента функции pthread_create.
Edit: Возможно, вам также следует знать о проблемах с отложенным распределением. Ваши 8 МБ виртуального пространства не будут использовать 8 МБ физической памяти, если вы не читаете или не пишете везде в этом пространстве памяти.