CreateThread против fork () - PullRequest
5 голосов
/ 06 марта 2009

Есть ли у нас какие-либо отношения между fork () и CreateThread? Есть ли что-нибудь, что CreateThread внутренне вызывает fork ()?

Ответы [ 6 ]

10 голосов
/ 06 марта 2009

В NT основная рабочая единица называется потоком (т. Е. NT планирует потоки, а не процессы). Пользовательские потоки выполняются в контексте процесса. Когда вы вызываете CreateThread, вы запрашиваете ядро ​​NT выделить рабочий блок в контексте вашего процесса (у вас также есть волокна, которые в основном являются потоками, которые вы можете планировать самостоятельно, но это выходит за рамки вашего вопроса).

Когда вы вызываете CreateThread, вы предоставляете функции точку входа, которая будет запускаться после вызова функции. Код должен находиться в виртуальном пространстве процесса, а страница должна иметь права на выполнение. Проще говоря, вы даете указатель на функцию. ;)

fork () - это функция UNIX, которая запрашивает ядро ​​о создании копии запущенного процесса. Родительский процесс получает pid дочернего процесса, а дочерний процесс получает 0 (таким образом, вы знаете, кто вы есть).

Если вы хотите создать процесс в Windows, вы вызываете функцию CreateProcess, но она не ведет себя как fork (). Причина в том, что большую часть времени вы будете создавать потоки, а не процессы.

Как видите, между CreateThread и fork нет никакой связи.

5 голосов
/ 06 марта 2009

fork () существует только в системах Unix и создает новый процесс с тем же состоянием, что и у вызывающего. CreateThread () создает новый поток в том же процессе.

1 голос
/ 21 марта 2011

Возможно, вы захотите узнать, что Microsoft предоставляет fork () в высокопроизводительных версиях Windows с компонентом Подсистема для приложений на основе UNIX (SUA). Подробности можно найти в моем ответе здесь .

1 голос
/ 06 марта 2009

Модель процессов Windows и Unix принципиально сильно отличается, поэтому нет способа напрямую сопоставить API один поверх другого.

fork () клонирует текущий процесс на две части. В родительском процессе fork () возвращает pid, а в дочернем - 0. Это обычно используется так:

int pid;
if (pid = fork()) {
    // this code is executed in the parent
} else {
    // this code is executed in the child
}

Cygwin - это слой эмуляции для сборки и запуска приложений Unix в Windows, который эмулирует поведение fork () с помощью CreateProcess ().

1 голос
/ 06 марта 2009

CreateThread - для потоков, fork - для создания дублирующегося процесса. И нет никакого собственного способа иметь функциональность форка для окон (по крайней мере, через Win32).

0 голосов
/ 24 февраля 2010

Нашел эту ссылку, которая, как мне кажется, может помочь в очистке нескольких фактов, касающихся разветвления / потоков Поделиться здесь: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...