Войти
ПрограммированиеФорумОбщее

CentOS 8 + std::this_thread::get_id + static link = crash

#0
19:35, 24 фев. 2021

Привет. Собираю C++ приложение на линуксах, и наткнулся на такое: std::this_thread::get_id приводит к segmentation fault, но только если есть инстанцирование std::thread. Иначе он возвращает 1. Минимальный пример:

#include <thread>
#include <iostream>

template <typename T>
void print(T value)
{
    std::cout << value << "\n";
    std::cout.flush();
}

int main()
{
    print("Begin");

    print(std::this_thread::get_id());
    //print(pthread_self());

    print("Checkpoint");

    //std::thread([&]{}).join(); // [1]

    print("End");

    return 0;
}

Сборка (можно clang, можно gcc - результат одинаковый):

clang++ ./main.cpp -o main -static -std=c++17 -DNDEBUG -lpthread

Если строчка [1] закомментирована - все работает. Если раскомментировать - segmentation fault при вызове std::this_thread::get_id. При этом pthread_self работает, и сами потоки тоже работают нормально.

Установленные пакеты:

+ Показать

Подскажите пожалуйста, в чем может быть дело, что можно попробовать, куда можно посмотреть. Спасибо.


#1
20:02, 24 фев. 2021

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590
Почему так происходит я не понял.

#2
(Правка: 20:17) 20:15, 24 фев. 2021

Dimich
Да, уже нашел, еще тут (у геймдева парсер с ума сходит от такой ссылки)

> https://www.mail-archive.com//msg248775.html

> Since glibc 2.27 the pthread_self symbol has been defined in libc rather than libpthread. Because we only call pthread_self through a weak alias it's possible for statically linked executables to end up without a definition of pthread_self. This crashes when trying to call an undefined weak symbol.

Короче остается ждать когда 10-й gcc в репы зальют (баг вроде как пофикшен). Ну или собирать его самому (а можно не надо >_<). Ладно, если проблема всего в одном месте, то с этим можно жить.

#3
20:23, 24 фев. 2021

Dimich
Нашел воркэраунд. Там у чего-то там внутри ленивая инициализация. Если в начале вызвать pthread_self, то далее std::this_thread::get_id работает.

#4
9:00, 25 фев. 2021

Компилятору -pthread и линкеру -lpthread указываешь?

ПрограммированиеФорумОбщее