C++11: зависит ли std:: thread в linux от библиотеки pthread?
Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений.
Итак, я хочу знать в системе linux, как GCC / clang реализует std::thread, вызывает ли он некоторые собственные функции linux / API ядра или что-то еще?
Также, как реализуется std::thread_local, связанный с __thread?
3 ответов:
Используйте
ldd myExecutableна выходе компилятора, чтобы узнать.И libstdc++, и libc++, по-видимому, используют pthreads, но они не обязаны это делать. Доказательства этого можно найти в документации native_handle methods here и here. В документах говорится:
Обращается к собственному дескриптору *this.
Значение и тип результата этой функции определяются реализацией. В системе POSIX это может быть значение типа pthread_cond_t*. На Система Windows, это может быть PCONDITION_VARIABLE.
И
Возвращает дескриптор базового потока, определенный реализацией.
Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений.
Есть утверждение в окрестности этого, которое истинно, но это утверждение, как написано, не истинно.
Здесь есть два факта.
Если Вы вызываете функции pthreads самостоятельно, это действительно просто библиотека C, и вам лучше убедиться, что вы все делаете правильно в отношении исключения безопасность. Если вы передадите указатели на функции
pthread_create_..., и эти функции будут выдавать исключения... ваша программа может иметь большие проблемы. Это должно быть очевидно, это будет верно всякий раз, когда вы говорите с библиотекой C из C++.Это не значит, что такую библиотеку нельзя использовать с программой на языке C++!
Pthread на самом деле не нужно знать ни о каких ваших объектах, ни о каких их ctors или dtors, ни о чем из этого, чтобы сделать вашу программу многопоточной. Все, что ему нужно порождает поток, является указателем функции, и этот указатель функции будет иметь полностью c-совместимую подпись.
Когда компилятор C++ вызывает функции pthreads для реализации
std::thread, компилятор будет выдавать код, который правильно обращается к pthread. Если он использует pthread незаконным образом для реализации вашей программы на C++, это ошибка в компиляторе или стандартной библиотеке.
Эта информация неточна.Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений.
Как GCC / clang реализует
std::threadОни вызывают специфичную для платформы функцию создания потока. В Linux это
pthread_create. Вы можете вызвать эту функцию напрямую.Когда поток создает исключение и оно не перехвачено, вызывается
std::terminate.Обратите внимание, что ваше приложение должен быть скомпилирован и связан с флагом
-pthread(Использование-lpthreadявляется ненужным и недостаточным как для C, так и для C++).
Comments