Но если я попытаюсь загрузить эту библиотеку в какое-либо приложение, из вызова библиотеки std::async выдается исключение типа «Включить многопоточность для использования std::thread: операция не разрешена». Если я затем свяжу -lpthread с этим приложением, все станет хорошо. Я имею в виду, если он связан и называется так:
Код: Выделить всё
[user@os Folder]$ ldd libSomeLib.so | grep pthread
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f8fc1f38000)
[user@os Folder]$ ldd some_app | grep pthread
[user@os Folder]$ ./some_app
terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)
[user@os Folder]$
Код: Выделить всё
[user@os Folder]$ ldd libSomeLib.so | grep pthread
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f6828eca000)
[user@os Folder]$ ldd some_app | grep pthread
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007faaafe90000)
[user@os Folder]$ ./some_app
Some fine output
[user@os Folder]$
Это особенность многопоточности STL или я что-то пропустил? Если это функция, то зачем нужно связывать приложение с помощью -lpthread? Если это что-то, что я пропустил, то что именно я пропустил?
РЕШЕНО:
Как сказал @AndreyTurkin, ссылаясь здесь:
использование std::thread в библиотеке, загруженной с dlopen, приводит к сигсеву
Это ограничение libstdc++.
Здесь также упоминается @HansPassant: std::async с gcc 7.2 требует опции ссылки на pthread
Подробнее здесь: https://stackoverflow.com/questions/798 ... sync-needs
Мобильная версия