Почему приложению, которое зависит от динамически подключаемой библиотеки с std::async, нужен -lpthread?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему приложению, которое зависит от динамически подключаемой библиотеки с std::async, нужен -lpthread?

Сообщение Anonymous »

Я разрабатываю динамически подключаемую динамическую библиотеку (т.е. плагин) для Linux. Этот плагин использует std::async. ldd показывает, что этот плагин зависит от -lpthread. Кажется нормальным.
Но если я попытаюсь загрузить эту библиотеку в какое-либо приложение, из вызова библиотеки 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»