В g++ есть модель потока С++ 11 с использованием pthreads в фоновом режиме?
Я просто пытаюсь использовать функции g++ 4.6
и C++11
.
Каждый раз, когда я компилирую простой код потока с использованием флага -std=c++0x
, либо он выходит из строя с ошибкой сегментации, либо просто бросает какое-то странное исключение.
Я прочитал несколько вопросов, связанных с потоками C++11
, и я понял, что для компиляции кода мне также необходимо использовать флаг -pthread
. Использование -pthread
отлично работало, и я смог запустить потоковый код.
Мой вопрос: использует ли C++11
многопотоковая модель Pthreads
в фоновом режиме?
Или это написано с нуля?
Я не знаю, есть ли кто-либо из участников gcc
, но мне просто интересно.
Ответы
Ответ 1
Если вы запустите g++ -v
, он даст вам кучу информации о том, как она была настроена. Одна из таких вещей будет, как правило, строкой, которая выглядит как
Thread model: posix
что означает, что он настроен на использование pthreads для своей библиотеки потоков (std:: thread в libstdС++), а это означает, что вам также необходимо использовать любые флаги, которые могут потребоваться для pthreads в вашей системе (-pthread
в Linux).
Это не имеет ничего общего со стандартом, его просто деталь того, как стандарт реализуется g++
Ответ 2
С++ не определяет, как реализованы потоки. На практике потоки С++ обычно реализуются как тонкие обертки над уже существующими библиотеками системных потоков (например, потоки pthreads или windows). Существует даже условие доступа к основному объекту потока с помощью std:: thread:: native_handle().
Ответ 3
Причина, по которой он выходит из строя, заключается в том, что если вы не укажете -pthreads
или -lpthreads
, связано несколько слабо определенных функций-заглушек pthreads из libc
. Эти функции заглушки достаточно, чтобы ваша программа могла связываться без ошибок. Однако на самом деле создание pthread требует полной библиотеки libpthread.a, и когда динамический компоновщик (dl
) пытается разрешить эти недостающие функции, вы получаете нарушение сегментации.