C ++ 11 std :: threads vs posix 스레드


157

실제로 왜 서로 선호해야합니까? std::thread클래스 라는 점을 제외하고 기술적 차이점은 무엇입니까 ?


5
실제로 당신은 사용해야합니다std::async
Stephan Dollberg

같은 문제로이 겪고있다을 @bamboon std::thread않습니다
군터 Piez에게

2
컴파일러 지원보기에서 @hirschhornsalz, 예. 기술적 인 관점에서 예외 안전, 제공 std::thread또는 pthreads하지를.
Stephan Dollberg

15
다시 열기로 투표 "기술적 차이"에 대한 요청은이를 객관적으로 대답 할 수있게합니다. 높은 투표 수는 다른 사람들이이 게시물이 건설적이고 도움이됨을 발견했음을 나타냅니다.
Adrian McCarthy

답변:


122

많은 플랫폼에서 코드를 실행하려면 Posix Threads로 이동하십시오. 그들은 거의 모든 곳에서 사용 가능하며 아주 성숙합니다. 반면에 Linux / gcc 만 사용하는 경우std::thread 완벽하게 괜찮습니다. 추상화 수준이 높고 인터페이스가 뛰어나며 다른 C ++ 11 클래스와 잘 어울립니다.

std::thread불행히도 C ++ 11 클래스는 C ++ 11이 사용 가능한 것처럼 보이지만 모든 플랫폼에서 안정적으로 작동하지는 않습니다. 예를 들어 기본 Android std::thread또는 Win64에서는 작동하지 않거나 심각한 성능 병목 현상이 있습니다 (2012 년 기준).

좋은 대체 방법은 boost::thread- std::thread실제로 동일한 저자의 것과 매우 유사하고 안정적으로 작동하지만 물론 타사 라이브러리의 또 다른 종속성을 소개합니다.


편집 : 2017 년 현재 std::thread대부분 기본 Android에서 작동합니다. 같은 일부 클래스 std::timed_mutex는 여전히 구현되지 않습니다.


19
이러한 "성능 병목 현상"주장을 뒷받침 할 증거가 있습니까? 또한 std::threadpiis는 즉시 사용할 수 없지만 C ++ 예외를 처리 할 수 ​​있으므로 raii 스타일이 좋습니다.
Jesse Good

9
이제 2014 년에도이 답변이 여전히 유효합니까?
nonsensation

25
2017 년 초 현재는 어떻습니까?
rmobis

9
2017 년 중반에 지금은 어떻습니까?
궤도에서 가벼움 레이스

14
이제 2018 년 중반은 어떻습니까?
陳 力

59

std::thread라이브러리 (예 : 된 libstdc을 ++) 환경에서의 pthreads지지 pthreads의 상단에서 구현된다.

둘 사이의 큰 차이점은 추상화라고 생각합니다. std::threadC ++ 클래스 라이브러리입니다. std::thread범위의 잠금 장치, 재귀 뮤텍스, 미래 / 약속 디자인 패턴 구현 등 : 라이브러리는 예를 들어 많은 추상 기능이 포함되어 있습니다.


4
+1std :: thread가 가장 중요한 것을 지적 해준 것에 대해 더 높은 수준의 추상화를 제공합니다.
sbi

33

std::thread Windows, MacOS 및 Linux와 같은 다양한 플랫폼에서 이식성을 제공합니다.

아래의 코멘트에 @hirshhornsalz 언급하고 대답 관련으로 https://stackoverflow.com/a/13135425/1158895을 , std::thread아직 모든 플랫폼에서 완전하지 않을 수 있습니다. 그럼에도 불구하고 (가까운 미래에도) pthread응용 프로그램을 미래에 대비해야하기 때문에 선호해야합니다 .


2
실제로 std :: threads는 C ++ 11을 지원하는 모든 플랫폼에서 이식성을 제공하는 반면 POSIX 스레드는 POSIX 플랫폼 (또는 최소한의 호환성을 위해 노력하는 플랫폼)에서만 사용할 수 있습니다.
Tobias Langner

1
실제 POV에서 이것은 잘못된 것입니다. 나는 실제로 몇 달 전에이 추론을 결정했습니다. 큰 실수였습니다. 실제로 boost::threadWin64 또는 Bionic (Android)에서 사용해야 합니다 .Linux std::thread에서는 여전히 std::thread성숙해 보이는 부분이 부족 하기 때문 입니다 .
Gunther Piez

1
@hirschhornsalz, 내 대답의 요점은 pthread와 비교하여 c ++ 11 스레드 구현에서 제공하는 이식성의 이점을 지적하는 것입니다. OP는 부스트에 대해 묻지 않았지만 이식성도 요구했다.
Brady

3
@hirschhornsalz, 스레드를 사용하지 않은 부정적인 톤과 비난에 관해서는 단순히 방해가되지 않으며 내 노력에 많은 노력을 기울일 필요가 없습니다. 나는 다른 플랫폼에서 std :: thread를 사용하려고했던 문제를 지적하는 것이 더 건설적인 의견이라고 언급하면서 적어도 가치가 있다고 생각합니다.
Brady

3
요약하면, c ++ 11 std :: thread는 최신 버전의 GCC에서만 사용할 수 있습니다. Visual Studio에서는 거의 완성되지 않았으므로 Windows에서는 사용할 수 없습니다. 물론 UNIX의 상용 컴파일러 (Solaris의 Sun Studio, HP-UX의 HP aCC, AIX의 IBM vacpp)에서는 절대로 빠져 있습니다. 따라서 대상 플랫폼이 Linux 전용 인 경우-c ++ 11 std :: thread는 정상입니다. Windows 또는 다른 UNIX가 필요한 경우 boost :: thread를 사용하십시오.
vond

7

저에게 기술적 차이는 pthread와 달리 std에 신호 처리 프리미티브가 없다는 것입니다. std 만 사용하여 Unix 프로세스에서 신호 처리를 올바르게 지시 할 수없는 것은 AFAIK가 std :: thread를 사용하는 데있어 쇠약 한 결함입니다. 실을 끼 우고 나머지 부분을 막으십시오. pthreads를 사용하여 std :: thread를 구현한다고 가정하고 pthread_sigmask를 사용할 때 최상의 결과를 기대합니다. 기업을위한 Unix 시스템 프로그래밍에서 신호를 올바르게 처리하는 것은 협상이 불가능합니다.

2016 년에 std :: thread는 장난감입니다. 그렇게 간단합니다.


7
동의하지 않습니다. 또한 신호를 많이 사용하는 것은 대부분의 애플리케이션에서 피할 수있는 디자인 패턴입니다.
Erik Alapää

또한 std::threadpthread에는없는 유형 안전성을 제공합니다.
alfC

-3

OpenMP

http://www.openmp.org/

이미 10 년 이상 Linux 및 Windows에서 작업 해 온 표준화 된 SMP 기반 멀티 스레딩 표준입니다. OpenMP는 기본적으로 GCC 및 Microsoft Visual Studio를 포함한 모든 컴파일러에서 사용할 수 있습니다.

OpenMP를 사용할 때주의해야 할 사항은 CPU 코어보다 많은 스레드가 있으면 컨텍스트 전환 관련 오버 헤드로 인해 성능이 저하된다는 것입니다. 두 번째로 명심해야 할 것은 실제 운영 체제 수준의 스레드 초기화는 상대적으로 비싸다는 것입니다. 초기화는 1 초의 1 분의 1이지만, 일부 응용 프로그램에서는 매우 작은 부분이 상당한 비용으로 축적됩니다.

소프트웨어 아키텍처 요구 사항 관련 동시성 OpenMP를 사용하는 대신 "경량 스레드"또는 "녹색 스레드"의 일부 구현을 검색 할 수 있습니다. 차이점은 OpenMP 스레드는 실제 운영 체제 수준의 스레드이지만 "녹색 스레드"는 일부 실제 스레드를 사용하여 실행되는 "시뮬레이션 된 스레드"일 수 있다는 것입니다.


6
무례하지는 않지만 이것이 주요 질문과 어떤 관련이 있습니까?
SRG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.