Подтвердить что ты не робот

В g++ есть модель потока С++ 11 с использованием pthreads в фоновом режиме?

Я просто пытаюсь использовать функции g++ 4.6 и C++11. Каждый раз, когда я компилирую простой код потока с использованием флага -std=c++0x, либо он выходит из строя с ошибкой сегментации, либо просто бросает какое-то странное исключение.

Я прочитал несколько вопросов, связанных с потоками C++11, и я понял, что для компиляции кода мне также необходимо использовать флаг -pthread. Использование -pthread отлично работало, и я смог запустить потоковый код.

Мой вопрос: использует ли C++11 многопотоковая модель Pthreads в фоновом режиме? Или это написано с нуля?

Я не знаю, есть ли кто-либо из участников gcc, но мне просто интересно.

4b9b3361

Ответ 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) пытается разрешить эти недостающие функции, вы получаете нарушение сегментации.