Если ANSI C ++ не поддерживает многопоточность, как неуправляемые приложения C ++ могут быть многопоточными? - PullRequest
3 голосов
/ 11 мая 2009

Я слышал, что в C ++ нет встроенной поддержки многопоточности. Я предполагаю, что многопоточные приложения C ++ зависят от управляемого кода для многопоточности; то есть, например, приложение Visual C ++ использовало MFC или .NET или что-то в этом роде для обеспечения возможности многопоточности. Я также предполагаю, что некоторые или все эти возможности управляемого кода недоступны для неуправляемых приложений. Но я читал о неуправляемых многопоточных приложениях. Как это возможно? Какое из моих предположений неверно?

Ответы [ 8 ]

12 голосов
/ 11 мая 2009

Это полностью зависит от операционной системы, чтобы обеспечить поддержку многопоточности. В Windows необходимые функции доступны через Win32 API. Фреймворки, такие как MFC , предоставляют оболочки для низкоуровневых функций потоков, что упрощает работу, и, конечно, .NET / CLR имеет собственный управляемый интерфейс для доступа к возможностям многопоточности Win32.

Хорошее объяснение предлагается в этой статье ( Многопоточность в C ++ ).

Почему в C ++ нет встроенного Поддержка многопоточности?

C ++ не содержит встроенных поддержка многопоточных Приложения. Вместо этого он полагается полностью на операционной системе предоставить эту функцию. Учитывая, что оба Java и C # обеспечивают встроенную поддержку для многопоточности естественно спросите, почему это не так C ++. Ответы - эффективность, контроль и спектр применения к которому применяется C ++. Давайте рассмотрим каждый.

Не встроив поддержку многопоточность, C ++ не пытается определить «один размер подходит всем» решение. Вместо этого C ++ позволяет вам напрямую использовать многопоточность функции, предоставляемые операционной система. Этот подход означает, что ваш программы могут быть многопоточными в наиболее эффективные средства, поддерживаемые среда исполнения. Потому что многие многозадачные среды предлагают богатые поддержка многопоточности, возможность чтобы получить доступ к этой поддержке имеет решающее значение для создание высокоэффективных, многопоточные программы.

4 голосов
/ 11 мая 2009

Многопоточность в C ++ не требует управляемого кода.

Практически так же, как C ++ не обеспечивает встроенную поддержку для отображения графики или воспроизведения звуков или чтения ввода с помощью мыши, используемая операционная система будет предоставлять C ++ API для использования этих функций.

Дело не в том, что C ++ не может этого сделать. Он просто еще не был записан в стандарт C ++.

3 голосов
/ 11 мая 2009

Некоторые из ваших предположений не совсем верны. Операционная система (я говорю о win32, поскольку вы упоминаете .NET) обеспечивает поддержку потоков. Есть много хороших потоковых библиотек. это построение поверх функциональности ОС в C ++ для упрощения многопоточности :) - pthreads например Вот еще на MSDN .

2 голосов
/ 11 мая 2009

Стандарт ISO для языка программирования C ++ не определяет и не запрещает многопоточность. Реализация может предоставлять расширения, если она пожелает. Программе разрешено использовать расширения реализации, если она того пожелает, и тогда программа будет работать только в системах, которые предоставляют эти расширения.

Для сравнения, стандарт ISO для языка программирования C ++ не определяет и не запрещает использование мыши. Программе разрешено использовать расширения реализации, и тогда она будет работать только в тех системах, которые предоставляют эти расширения. Для сравнения, стандарт ISO для C ++ не определяет и не запрещает UTF-8, поэтому ваша программа может зависеть от Latin-1, и тогда ваша программа будет работать только в системах, которые предоставляют Latin-1.

1 голос
/ 11 мая 2009

Native C ++ не предлагает «встроенную» поддержку многопоточности просто потому, что она не была предназначена или фактически необходима. Ваше заблуждение состоит в том, что это ошибка, хотя на самом деле это сила языка. Будучи «не обращающим внимания» на многопоточность, C ++ легко интегрируется с поддержкой MT, предлагаемой операционной системой, в которой ваш код будет компилироваться и работать, предлагая тем самым гораздо большую гибкость и эффективность, чем если бы он шел с собственным «багажом MT», так сказать. Вы упоминаете MFC и .NET в качестве примеров - имейте в виду, что эти библиотеки / оболочки являются просто слоем над основными Win32 API. Использование C ++ по назначению предоставит вам эффективный код, который будет многопоточно выполняться на ЛЮБОЙ ОС, если вы отделите логику от вызовов MT API для конкретной ОС (т. Е. Создание потоков и т. Д.), Так что перенос между ОС значительно упрощается.

0 голосов
/ 11 мая 2009

Следующий стандарт C ++ (названный c ++ 0x) будет поддерживать многопоточность. Будет включать атомные операции.

0 голосов
/ 11 мая 2009

Я думаю, вы неправильно поняли определение «управляемого» кода. «Управляемый» код - это специфический для Microsoft термин, означающий код, который использует платформу .NET и, таким образом, подчиняется различным аспектам .NET. «Неуправляемый» код означает код, который выполняется за его пределами и не работает на уровне .NET. Код MFC неуправляемый; это просто потрясающе плохая оболочка для вездесущего Win32 API (который даже не является API самого низкого уровня, доступного в Windows).

.NET-библиотеки (включая многопоточность) на определенном уровне почти все являются интерфейсами для более базовых системных API, используемых традиционными «неуправляемыми» приложениями. Вообще говоря, нет никакой функциональности, доступной для «управляемого» кода, который не может быть реплицирован в «неуправляемый» код с достаточным усилием, хотя обратное неверно (это называется штрафом за абстракцию, если вы хотите узнать больше). Хотя это может быть легче сделать в «управляемом» коде, но это просто потому, что где-то какой-то «неуправляемый» код делает это для вас, более или менее. В случае с многопоточным API это, в свою очередь, интерфейс с ядром операционной системы, который сам получает доступ к возможностям процессора, позволяя процессу запускаться одновременно в нескольких местах (если используется несколько ядер; если нет, то это просто псевдо-версия). -concurrency).

Стандарт C ++ в настоящее время не содержит определения потоков (в будущем стандарте C ++ 1x это не так). Существует несколько различных доступных библиотек потоков, включая библиотеки Win32 и MFC, библиотеку pthreads в системах POSIX и Boost.Thread, которые будут использовать локальную библиотеку потоков платформы.

0 голосов
/ 11 мая 2009

В отличие от Java, в котором определены языковые конструкции и спецификации JVM, стандарт C ++ не учитывает многопоточность (как и C). Что касается этих языков, то все, что связано с потоками, состоит из вызовов функций для функциональности ОС. Библиотеки, скомпилированные для многопоточности, просто имеют смысл одних и тех же вызовов, но с точки зрения языка они представляют собой простой старый код.

...