Проблема
Я получаю переполнение стека, если связываюсь с библиотекой, и не получаю его, если не делаю. Вот код:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define ASSERT_FATAL(cond) \
do { if (!(cond)) { printf("FAILED COND\n"); exit(-1); } } while(0)
void *func(void *dummy) {
// let's make sure the compiler doesn't optimize this out
volatile char buf[80000];
for (int i = 0; i < sizeof(buf); ++i)
buf[i] = rand() % 128;
sleep(1);
printf("Thread finished\n");
}
int main() {
pthread_t thread_id;
pthread_attr_t attr;
ASSERT_FATAL(pthread_attr_init(&attr) == 0);
ASSERT_FATAL(pthread_attr_setstacksize(&attr, 100000) == 0);
ASSERT_FATAL(pthread_create(&thread_id, &attr, func, NULL) == 0);
pthread_attr_destroy(&attr);
sleep(2);
return 0;
}
Для воспроизведения:
- Работает нормально с
gcc test.c -pthread -O3
- Сбои с переполнением стека с
gcc test.c -pthread -O3 -Wl,--no-as-needed /usr/lib/x86_64-linux-gnu/libcholmod.so -Wl,--as-needed
ПРИМЕЧАНИЕ: я использую cholmod
, потому что это было источником моих проблем в большей кодовой базе. В Ubuntu вы можете получить его, установив libsuitesparse-dev
.
Мой вопрос
Что здесь происходит? Если я увеличу размер стека, он будет работать, но я хочу понять, что его вызывает. Может ли файл .so выполнять инициализацию для каждого потока и как-то уменьшить доступное пространство стека?
EDIT 1 : изменен весь код C ++ для чистого C кода
EDIT 2 : подтверждение результата создания потока / установки атрибута