Я считаю, что вам нужна функция pthread_attr_setstacksize
.По умолчанию glibc резервирует 2 МБ, 8 МБ или 10 МБ или память для стека каждого потока.При такой скорости вы быстро исчерпаете виртуальное адресное пространство на 32-разрядной машине и быстро исчерпаете комиссионный сбор даже на 64-разрядных машинах.
pthread_t td;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 32768);
pthread_create(&td, &attr, start_function, start_art);
pthread_attr_destroy(&attr);
Этот код слишком упрощен;естественно, вы можете захотеть проверить сбой некоторых из этих вызовов.На самом деле, именно об этом и был ваш вопрос.pthread_*
почти все функции возвращают код ошибки в качестве значения возврата , а не errno
, поэтому errno
не может использоваться для проверки результата, и perror
не будет работать, если вы не назначитевозвращаемое значение errno
.Вместо этого сделайте что-то вроде:
result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}