Какие языки высокого уровня поддерживают многопоточность? - PullRequest
9 голосов
/ 26 сентября 2008

Мне интересно, какие языки поддерживают (или не поддерживают) нативную многопоточность и, возможно, получают некоторые подробности о реализации. Надеемся, мы сможем составить полный обзор этой конкретной функции.

Ответы [ 14 ]

6 голосов
/ 26 сентября 2008

Erlang имеет встроенную поддержку параллельного программирования .

Строго говоря, эрланговские процессы - это гринлеты. Но язык и виртуальная машина спроектированы с нуля для поддержки параллелизма. Язык имеет специфические структуры управления для асинхронного обмена сообщениями между процессами.

В Python greenlet - сторонний пакет, обеспечивающий легкие потоки и обмен сообщениями на основе каналов. Но это не терпит сравнения с Эрлангом.

3 голосов
/ 27 сентября 2008

Полагаю, что список языков более высокого уровня, чем Haskell , довольно короткий, и он довольно неплохо поддерживает параллелизм и параллелизм .

3 голосов
/ 26 сентября 2008

Более старые версии C и C ++ (а именно, C89, C99, C ++ 98 и C ++ 03) вообще не поддерживают основной язык, хотя библиотеки, такие как потоки POSIX, доступны практически для любой платформы. сегодня у обычного пользователя.

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

3 голосов
/ 26 сентября 2008

С CPython нужно помнить о GIL . Подводя итог: только один процессор используется, даже на многопроцессорных машинах. Как показывают комментарии, есть несколько способов обойти это.

2 голосов
/ 14 октября 2008

Clojure - это готовящийся к выпуску Lisp-диалект для JVM, специально разработанный для обеспечения параллелизма.

Он имеет API функционального стиля, некоторые очень эффективные реализации различных неизменяемых структур данных и агентскую систему (немного похожую на акторов в Scala и процессы в Erlang). Он даже имеет программную транзакционную память.

В целом, Clojure делает все возможное, чтобы помочь вам написать правильный многопоточный и параллельный код.

2 голосов
/ 26 сентября 2008

Delphi / FreePascal также поддерживает потоки.

Я предполагаю, из других ответов, что это только нативно на платформах Windows.

Несколько хороших библиотек, которые реализуют лучшие функции поверх объекта TThread:

1 голос
/ 28 сентября 2008

Недавно я сделал многопоточное расширение для Lua, которое называется Lua Lanes . Он настолько естественным образом объединяет концепции многопоточности с языком, что я бы не увидел, что «встроенная» многопоточность лучше.

Для протокола, часто можно использовать встроенную многопоточность (сопрограммы) Lua. С дорожками или без них.

Лейнс не имеет GIL и выполняет код в отдельных юниверсах Lua для каждого потока. Таким образом, если ваши библиотеки C не будут аварийно завершены, это неуязвимо для проблем, связанных с использованием потоков. Фактически, эта концепция больше похожа на процессы и передачу сообщений, хотя используется только один процесс ОС.

1 голос
/ 28 сентября 2008

Perl не поддерживает нативные потоки.

Да, есть модуль потоков Perl, и да, он использует собственные потоки платформы в своей реализации. Проблема в том, что в общем случае это не очень полезно.

Когда вы создаете новый поток с использованием потоков Perl, он копирует все состояние интерпретатора Perl. Это очень медленно и использует много оперативной памяти. На самом деле это, вероятно, медленнее, чем использование fork () в Unix, поскольку последний использует копирование при записи, а потоки Perl - нет.


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

Разве в наши дни не вышли из моды темы в пользу процессов? (Вспомним Google Chrome, IE8)

1 голос
/ 28 сентября 2008

Этот вопрос не имеет смысла: выбирает ли конкретная реализация реализацию потоков как собственных или зеленых потоков, не имеет ничего общего с языком, это внутренняя деталь реализации.

Существуют реализации Java, которые используют собственные потоки, и реализации Java, которые используют зеленые потоки.
Существуют реализации Ruby, которые используют собственные потоки, и реализации Ruby, которые используют зеленые потоки.
Существуют реализации Python, которые используют собственные потоки, и реализации Python, которые используют зеленые потоки.
Есть даже реализации POSIX Thread, которые используют зеленые потоки, например старая библиотека LinuxThreads или библиотека GNU pth.

И то, что реализация использует собственные потоки, не означает, что эти потоки могут фактически работать параллельно; многие реализации используют глобальную блокировку интерпретатора, чтобы гарантировать, что одновременно может работать только один поток. С другой стороны, использование зеленых потоков не означает, что они не могут работать параллельно: например, виртуальная машина BEAM Erlang может планировать свои зеленые потоки (точнее, зеленые процессы) на нескольких ядрах ЦП, то же самое планируется для Rubinius. Ruby VM.

1 голос
/ 26 сентября 2008

Boost :: thread отлично, я не уверен, что вы можете сказать, что это часть языка. Это зависит от того, считаете ли вы CRT / STL / Boost «частью» C ++ или необязательной дополнительной библиотекой.

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

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