Я думаю, вы неправильно поняли определение «управляемого» кода. «Управляемый» код - это специфический для Microsoft термин, означающий код, который использует платформу .NET и, таким образом, подчиняется различным аспектам .NET. «Неуправляемый» код означает код, который выполняется за его пределами и не работает на уровне .NET. Код MFC неуправляемый; это просто потрясающе плохая оболочка для вездесущего Win32 API (который даже не является API самого низкого уровня, доступного в Windows).
.NET-библиотеки (включая многопоточность) на определенном уровне почти все являются интерфейсами для более базовых системных API, используемых традиционными «неуправляемыми» приложениями. Вообще говоря, нет никакой функциональности, доступной для «управляемого» кода, который не может быть реплицирован в «неуправляемый» код с достаточным усилием, хотя обратное неверно (это называется штрафом за абстракцию, если вы хотите узнать больше). Хотя это может быть легче сделать в «управляемом» коде, но это просто потому, что где-то какой-то «неуправляемый» код делает это для вас, более или менее. В случае с многопоточным API это, в свою очередь, интерфейс с ядром операционной системы, который сам получает доступ к возможностям процессора, позволяя процессу запускаться одновременно в нескольких местах (если используется несколько ядер; если нет, то это просто псевдо-версия). -concurrency).
Стандарт C ++ в настоящее время не содержит определения потоков (в будущем стандарте C ++ 1x это не так). Существует несколько различных доступных библиотек потоков, включая библиотеки Win32 и MFC, библиотеку pthreads в системах POSIX и Boost.Thread, которые будут использовать локальную библиотеку потоков платформы.