2008-09-26 4 views
7

네이티브 멀티 스레딩을 지원하는 언어 (또는 지원하지 않는 언어)가 궁금하고 구현에 대한 세부 정보를 얻을 수 있습니다. 바라건대 우리는이 특정 기능의 전체 개요를 생성 할 수 있기를 바랍니다.멀티 스레딩을 지원하는 고급 언어는 무엇입니까?

+0

이것은 언어 문제가 아니며 구현 문제입니다. 질문이 의미가 없으므로 구현과 관련하여 읽어야한다고 제안합니다. – Marcin

+0

나는 Marcin이 구현에 관해 읽어야하는 것에 동의한다. 이 방법으로 요청한 이유는 대부분의 언어가 구현간에 병렬화하는 기능을 공유한다고 가정했기 때문입니다. 예를 들어 C 및 C++에는 사용하는 컴파일러에 관계없이 스레드가 있습니다. – bmdhacks

답변

4

C 및 C++의 이전 버전 (즉, C89, C99, C++ 98 및 C++ 03)은 POSIX 스레드와 같은 라이브러리가 거의 모든 언어에서 지원되지만 핵심 언어에서는 전혀 지원되지 않습니다. 플랫폼을 제공합니다.

C 및 C++, C11 및 C++ 11의 최신 버전에는 언어에 내장 된 스레딩 지원이 있지만 C11의 선택적 기능이므로 단일 코어 내장 시스템과 같은 구현에서는 원하는 경우 C11의 나머지 부분을 지원하면서 지원할 수 있습니다.

+0

더 이상 C++ 11에서는 그렇지 않습니다. –

+0

@MaxBeikirch : 감사합니다. 5.5 년 전이 답변이 처음 작성되었을 때 C++ 11이 존재하기 전에 사실이었습니다. :). –

+0

절대 :) 지금 당신의 대답은 정확하고 upvote 수 있습니다;) –

1

공식적인 squeak VM은 네이티브 (OS) 스레드를 지원하지 않지만 Gemstone 버전은 지원한다고 생각합니다.

(정확하지 않은 경우 자유롭게 편집하십시오.)

1

이 컨텍스트에서 "native"를 정의해야합니다.

Java는 일종의 내장 된 멀티 스레딩을 주장하지만, 거친 잠금 및 라이브러리 지원을 기반으로합니다. 현재 POSIX 스레드를 사용하는 C보다 '고유'하지 않습니다. 다음 버전의 C++ (0x)에는 스레딩 라이브러리도 포함됩니다.

1

나는 자바와 C# 지원 멀티 스레딩을 알고 C++의 다음 버전이 직접 지원하는 것을 ...

+0

C# 멀티 스레딩 API는 바보입니다. 그것을 할 수있는 방법은 세 가지가 있으며, 그 중 "모두가있다"는 것은 아닙니다. 스레드에서 결과가 필요하지 않으면 간단한 방법으로 작동합니다. 결과를 얻는 방법은 훨씬 복잡하고 개념적으로 다릅니다 (API 이름은 기억이 안납니다. 미안합니다). – akauppi

0

PerlPython (계획된 구현합니다 ... boost.org 라이브러리의 일부로 사용할 수 있습니다) 해야 할 것. Ruby가 작업하고 있지만 Ruby 1.8의 스레드는 실제로 쓰레드가 아닙니다.

+0

JRuby 또는 Ruby.NET 또는 IronRuby의 스레드가 "실제 스레드가 아닌"스레드가 무엇인지 "실제로 스레드"가 무엇인지 정의 할 수 있습니까? 이러한 모든 Ruby 1.8 구현은 전역 잠금 (Global Lock)없이 진정으로 동시적이고 병렬 인 네이티브 OS 스레드를 구현합니다. 스레드에서 뭘 더 원합니까? –

+0

JRuby, XRuby 또는 Ruby.net 용입니다. 대부분의 사람들이 사용하는 루비가 아닙니다. –

1

Boost::thread 위대하다. 나는 언어의 일부를 말할 수 있는지 잘 모르겠다. CRT/STL/Boost가 C++의 '일부'또는 선택적 부가 기능 라이브러리로 간주되는지 여부에 따라 다릅니다.

(그렇지 않으면 OS의 모든 기능이기 때문에 실제로는 언어에 원시 스레딩이 없습니다.)

3

CPython의 경우 GIL에 대해 기억해야합니다. 요약하면 : 멀티 프로세서 컴퓨터에서도 하나의 프로세서 만 사용됩니다. 코멘트가 보여주는 것처럼 여러 가지 방법이 있습니다.

+0

사실이 아닙니다. XRuby, Ruby.NET, JRuby, IronRuby, Jython, IronPython 및 기타 여러 가지 기능을 갖춘 진정한 병렬 스레드를 지원하는 Ruby 및 Python의 여러 구현이 있습니다. –

+0

나의 초기, 너무 일반적인 진술을 수정했습니다. –

6

Erlang에는 concurrent programming에 대한 지원이 내장되어 있습니다.

엄밀히 말하면, 얼랭 처리자는 미성년자입니다. 그러나 언어와 가상 머신은 처음부터 동시성을 지원하도록 설계되었습니다. 이 언어에는 비동기 프로세스 간 메시징을위한 특정 제어 구조가 있습니다.

파이썬에서 greenlet은 경량 스레드와 채널 기반 메시징을 제공하는 타사 패키지입니다. 그러나 Erlang과 비교할 수는 없습니다.

2

또한 Delphi/FreePascal은 스레드를 지원합니다.

다른 답변을 통해 Windows 플랫폼에서만 사용한다고 가정합니다.

TThread 개체의 상단에 더 나은 기능을 구현 어떤 좋은 도서관

는 :

2

이 질문은 의미가 없습니다. 특정 구현이 원시 스레드 또는 녹색 스레드로 스레드를 구현하도록 선택하는지 여부는 언어와 관련이 없습니다. 즉 내부 구현 세부 사항입니다.

녹색 스레드를 사용하는 원시 스레드와 Java 구현을 사용하는 Java 구현이 있습니다.
원시 스레드를 사용하는 Ruby 구현과 녹색 스레드를 사용하는 Ruby 구현이 있습니다.
녹색 스레드를 사용하는 원시 스레드와 Python 구현을 사용하는 Python 구현이 있습니다.
녹색 스레드를 사용하는 POSIX 스레드 구현도 있습니다. 오래된 LinuxThreads 라이브러리 또는 GNU pth 라이브러리.

구현이 원시 스레드를 사용한다고해서 실제로 이러한 스레드가 병렬로 실행될 수 있다는 의미는 아닙니다. 많은 구현에서는 Global Interpreter Lock을 사용하여 한 번에 하나의 스레드 만 실행할 수 있습니다. 한편, 녹색 스레드를 사용한다고해서 병렬로 실행할 수 없다는 의미는 아닙니다. 예를 들어 BEAM Erlang VM은 여러 개의 CPU 코어에서 녹색 스레드 (더 정확하게는 녹색 프로세스)를 예약 할 수 있으며 Rubinius Ruby VM.

1

Perl은 원시 스레드를 유용하게 지원하지 않습니다.

예, Perl 스레드 모듈이 있고 네 구현에 기본 플랫폼 스레드를 사용합니다. 문제는 일반적인 경우에는별로 유용하지 않다는 것입니다.

Perl 스레드를 사용하여 새 스레드를 만들면 Perl 인터프리터의 전체 상태를 복사합니다. 이것은 매우 느리며 많은 RAM을 사용합니다. 사실 유닉스에서 fork()를 사용하는 것보다 느리다. 후자는 copy-on-write를 사용하고 Perl 쓰레드는 쓰기를 사용하지 않기 때문이다.


그러나 일반적으로 각 언어마다 고유 한 스레딩 모델이 있으며 일부는 다른 것과 다릅니다. 파이썬 (주로)은 네이티브 플랫폼 스레드를 사용하지만 한 번에 하나만 실행되도록 (파이썬 코드) 큰 잠금 장치가 있습니다. 이것은 실제로 몇 가지 장점이 있습니다.

요즘 스레드가 프로세스에 유리하지 않습니까? (구글 크롬, IE8을 생각해 보라)

1

나는 최근 루아를 위해 Lua Lanes라고 불리는 멀티 쓰레딩 확장을했다. 그것은 다중 스레딩 개념을 자연스럽게 언어에 병합합니다. 멀티 스레딩이 더 나은 것은 아닙니다.

기록을 위해 Lua에 내장 된 협업 멀티 스레딩 (coroutines)을 종종 사용할 수도 있습니다. 차선 유무.

레인에는 GIL이없고 스레드별로 별도의 Lua 유니버스에서 코드가 실행됩니다. 따라서 C 라이브러리가 중단되지 않으면 스레드 사용과 관련된 문제가 발생하지 않습니다.실제로이 개념은 프로세스 및 메시지 전달과 비슷하지만 단 하나의 OS 프로세스 만 사용됩니다.

+0

최근에는 Lua (짧은 스크립팅 같은 코드)의 이점을 제공하지만 유형 안전성 (큰 코드베이스의 경우 필수)을 제공하는 스칼라로 전환했습니다. 스칼라의 액터 모델은 하나의 API로 협동 조합 (원시 루아 에서처럼)과 OS 스레드 기반 멀티 스레딩을 멋지게 결합합니다. – akauppi

2

Clojure은 병행 성을 효과적으로 처리 할 수 ​​있도록 특별히 설계된 JVM의 위와 같은 Lisp 방언입니다.

다양한 기능을 수행 할 수있는 다양한 API ()와 다양한 에이전트 시스템 (Scala의 액터와 Erlang의 프로세스)이 있습니다. 심지어 소프트웨어 트랜잭션 메모리도 있습니다.

모두 Clojure는 올바른 다중 스레드 및 동시 코드를 작성할 수 있도록 도와줍니다.

관련 문제