работа библиотек

Я работал с ‹ iostream> и другими общими библиотеками C++. Помимо этого, я также работал с такими библиотеками, как ‹ pthread.h>.

Теперь я прочитал, что системные вызовы, которые зависят от операционной системы, обеспечивают интерфейс между библиотеками и функциональной реализацией на оборудовании. Это видно по работе ‹ pthread.h>, которую мы можем использовать в Linux, но не в Windows. Я объясняю это тем, что внутри ‹ pthread.h> функции определяются с помощью системных вызовов UNIX, которые Windows не понимает.

Но ‹ iostream>, похоже, отлично работает как в Linux, так и в Windows. Теперь мой вопрос заключается в том, что даже функция
‹ iostream> должна быть определена с точки зрения системных вызовов, которые отличаются для Windows и Linux, тогда как же ‹ iostream> нормально работает в обеих ОС< /сильный>.

PS: я знаю, что согласно моей идее выше, все библиотеки (т.е. API) будут разделены по операционным системам или библиотеки будут иметь разные формы для разных операционных систем.


person AvinashK    schedule 26.09.2012    source источник


Ответы (1)


<iostream> является частью стандарта C++, который предоставляет пользователям интерфейс, позволяющий запускать один и тот же код C++ в разных операционных системах, хотя они реализованы с помощью разных системных вызовов.

<pthreads> является частью стандарта POSIX (Portable Operating System Interface) с той же целью для реализации многопоточных приложений. .

Пока все хорошо. Теперь самое сложное заключается в том, что Windows, похоже, не поддерживает pthreads, а также большинство других стандартов POSIX, потому что... ну, это нетрадиционно. Вместо этого у него есть собственная библиотека потоков, что-то вроде win32-threads.

Что касается операционных систем, я думаю, будет справедливо разделить их на два класса, а именно Windows и другие Unix-подобные операционные системы (linux, macos, solaris и т. д.). Это не значит, что Windows — злая операционная система, просто у них разные цели.

Если вам нужно переносимое многопоточное приложение, вы можете использовать библиотеку более высокого уровня, такую ​​как OpenMP (которая реализован с использованием pthreads в Linux и, возможно, что-то вроде win32-threads в Windows) или Intel TBB и так далее.

Также C++11 будет иметь собственную встроенную поддержку многопоточности, которую вы можете безопасно использовать таким же образом в Windows и других, предполагая, что эти компиляторы C++ будут полностью стандартными.

EDIT: я забыл упомянуть, что есть несколько проектов, направленных на внедрение стандартов POSIX в Windows, таких как Cygwin или Interix (разработан Microsoft, но не рекомендуется в Windows 8). Если вы хотите использовать <pthreads> в Windows, вы также можете использовать их. Потоковые вызовы, сделанные вами с помощью функций <pthreads>, будут сопоставлены с собственными потоками Windows.

person none    schedule 26.09.2012
comment
@gokcehan ... поэтому, пожалуйста, поправьте меня, если я ошибаюсь ... (1) стандартные библиотеки C++, такие как ‹ iostream›, имеют два набора определений для каждой функции. Один набор определяет функцию с использованием системных вызовов Windows, а другой набор определяет функцию с использованием Unix -как системные вызовы ОС. Набор для выполнения определяется компилятором на основе ОС, на которой он работает... (2) pthreads и другие библиотеки posix имеют только один набор определений, которые используют системные вызовы unix.. (3 ) Cygwin или interix используют те же сигнатуры функций, что и pthreads, но при их определении они включают win32-threads и используют его функции для их определения. - person AvinashK; 27.09.2012
comment
(1) Заголовки библиотеки C++, такие как <iostream>, устанавливаются как часть установки компилятора, что-то вроде gcc в Linux или cl.exe (компилятор Visual Studio) в Windows. Поскольку gcc не поддерживает окна (по крайней мере, изначально — см. mingw, если хотите еще больше запутаться) и наоборот, в заголовочном файле <iostream> нет системных вызовов для окон, которые существуют в системе Linux (проверено на моем компьютере). (2) да, если исключить cygwin и interix - person none; 27.09.2012
comment
(3) Я предполагаю, что да (не могу проверить, так как они у меня не установлены) (4) вещи не всегда черно-белые, поэтому общего понимания, скорее всего, будет достаточно для большинства целей, если вы не являетесь ядром хакер. - person none; 27.09.2012