приложению требуется много места в стеке, а на некоторых платформах требуется переопределение размера стека по умолчанию при создании
std::thread
использует pthread_create
для создания потоков на платформах, которые поддерживаютPOSIX.Другой вариант для вас - переопределить pthread_create
, установить размер стека и вызвать исходный pthread_create
.
Рабочий пример Linux (у меня нет доступа к MacOS, чтобы попробовать его там):
#include <cstdio>
#include <thread>
#include <dlfcn.h>
namespace {
size_t const STACK_SIZE = 8 * 1024 * 1024;
int pthread_create_override(pthread_t* thread, pthread_attr_t const* attr, void*(*start_routine)(void*), void* arg) noexcept {
std::printf("%s\n", __PRETTY_FUNCTION__);
pthread_attr_t attr2;
if(attr)
attr2 = *attr;
else
if(pthread_attr_init(&attr2))
std::abort();
size_t stacksize = 0;
pthread_attr_getstacksize(&attr2, &stacksize);
if(stacksize < STACK_SIZE) {
if(pthread_attr_setstacksize(&attr2, STACK_SIZE))
std::abort();
}
static auto const real_pthread_create = reinterpret_cast<decltype(&pthread_create)>(::dlsym(RTLD_NEXT, "pthread_create"));
int rc = real_pthread_create(thread, &attr2, start_routine, arg);
if(!attr)
pthread_attr_destroy(&attr2);
return rc;
}
} // namespace
extern "C" {
int pthread_create(pthread_t* thread, pthread_attr_t const* attr, void*(*start_routine)(void*), void* arg) {
return pthread_create_override(thread, attr, start_routine, arg);
}
} // namespace
int main() {
std::thread t([]() { std::printf("%s\n", __PRETTY_FUNCTION__); });
t.join();
}
Выходы:
int {anonymous}::pthread_create_override(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
main()::<lambda()>