Потоки имеют немного меньший вес, чем процессы, поскольку существует много вещей, которые процесс получает в свою собственную копию. Особенно, когда вы сравниваете время, необходимое для запуска нового потока, с началом нового процесса (с нуля, fork
там, где это возможно, также позволяет избежать больших затрат). Хотя в любом случае вы, как правило, можете добиться еще большей производительности, используя рабочий пул, где это возможно, вместо того, чтобы запускать и останавливать fre sh процессов / потоков.
Другое важное отличие состоит в том, что по умолчанию все потоки совместно используют одну и ту же память. в то время как процессы получают свои собственные и должны обмениваться данными с помощью более явных средств (которые могут включать в себя блоки общей памяти ). Это может помочь многопоточному программированию избежать копирования данных, но это также является одной из опасностей многопоточного программирования, когда не обращают внимания на то, как они используют общую память / объекты.
Также могут быть API, которые более ориентированы на один процесс. Например, в Windows есть порты завершения ввода-вывода, которые в основном работают на идее выполнения множества операций ввода-вывода для различных файлов, сокетов и т. Д. c. с несколькими потоками (но обычно гораздо меньшим, чем количество файлов / сокетов), обрабатывающими результаты по мере их поступления через GetQueuedCompletionStatus
l oop.