Portanto, temos um programa no Solaris que estava ficando sem espaço de pilha.
Enquanto investigava isso, dei uma breve olhada no que era ulimit para a pilha:
user@solaris-box:~$ ulimit -a
...
stack size (kbytes, -s) 8192
Portanto, o limite de tamanho da pilha é de 8 megabytes. Mas esse é o limite para todo o processo?
E se meu processo tiver 10 threads, eles são permitidos apenas 819k por thread? (ou alguma mistura deles, até 8MiB?)
Não consigo encontrar nenhum doco sobre isso.
RESUMO
Para o encadeamento principal, você precisa chamar
setrlimit()
(talvez usandoulimit
) antes que o processo seja iniciado para garantir que o tamanho da pilha maior seja efetivo.Para encadeamentos iniciados pelo processo, você precisa usar
pthread_attr_setstacksize()
como o tamanho da pilha do encadeamento não é afetado pelostack size
limite de recursos desetrlimit()
/getrlimit()
.O código precisa ficar mais ou menos assim:
Você pode obter o tamanho da pilha de threads do limite de tamanho da pilha atual:
(Observe que, se você estiver usando uma biblioteca que cria seus próprios threads, essa biblioteca pode ter seu próprio método documentado para definir o tamanho da pilha de threads, como OpenMPI.)
RESPOSTA DETALHADA
Os limites de recursos são definidos na linha de comando pelo
ulimit
utilitário .Se você correr
truss -f -a -vall -o /tmp/truss.out /usr/bin/ulimit -a
, você veráE se você olhar
/tmp/truss.out
, veráVemos que
ulimit
usa as funções da bibliotecagetrlimit()
(esetrlimit()
) para obter/definir limites de recursos.Por página
getrlimit()
/setrlimit()
man
( observe as partes em negrito):Portanto, o tamanho da pilha para encadeamentos criados pelo processo que não são o encadeamento principal não é afetado pelo
RLIMIT_STACK
limite de recursos do processo. E você precisa chamarsetrlimit()
ANTES do início do processo (no processo pai) para garantir que qualquer limite de tamanho de pilha maior seja realmente eficaz.Pela página
pthread_create()
man :