C++11: зависит ли std:: thread в linux от библиотеки pthread?



Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений.

Итак, я хочу знать в системе linux, как GCC / clang реализует std::thread, вызывает ли он некоторые собственные функции linux / API ядра или что-то еще?

Также, как реализуется std::thread_local, связанный с __thread?

221   3  

3 ответов:

Используйте ldd myExecutable на выходе компилятора, чтобы узнать.

И libstdc++, и libc++, по-видимому, используют pthreads, но они не обязаны это делать. Доказательства этого можно найти в документации native_handle methods here и here. В документах говорится:

Обращается к собственному дескриптору *this.

Значение и тип результата этой функции определяются реализацией. В системе POSIX это может быть значение типа pthread_cond_t*. На Система Windows, это может быть PCONDITION_VARIABLE.

И

Возвращает дескриптор базового потока, определенный реализацией.

Я читал, что pthread является библиотекой C и не совместим с объектной моделью C++, особенно когда речь идет об обработке исключений.

Есть утверждение в окрестности этого, которое истинно, но это утверждение, как написано, не истинно.

Здесь есть два факта.
  1. Если Вы вызываете функции pthreads самостоятельно, это действительно просто библиотека C, и вам лучше убедиться, что вы все делаете правильно в отношении исключения безопасность. Если вы передадите указатели на функции pthread_create_..., и эти функции будут выдавать исключения... ваша программа может иметь большие проблемы. Это должно быть очевидно, это будет верно всякий раз, когда вы говорите с библиотекой C из C++.

    Это не значит, что такую библиотеку нельзя использовать с программой на языке C++!

  2. 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++).

    Ничего не найдено.

Добавить ответ:
Отменить.