실제로 왜 서로 선호해야합니까? std::thread
클래스 라는 점을 제외하고 기술적 차이점은 무엇입니까 ?
std::thread
않습니다
std::thread
또는 pthreads
하지를.
실제로 왜 서로 선호해야합니까? std::thread
클래스 라는 점을 제외하고 기술적 차이점은 무엇입니까 ?
std::thread
않습니다
std::thread
또는 pthreads
하지를.
답변:
많은 플랫폼에서 코드를 실행하려면 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
는 여전히 구현되지 않습니다.
std::thread
piis는 즉시 사용할 수 없지만 C ++ 예외를 처리 할 수 있으므로 raii 스타일이 좋습니다.
std::thread
Windows, MacOS 및 Linux와 같은 다양한 플랫폼에서 이식성을 제공합니다.
아래의 코멘트에 @hirshhornsalz 언급하고 대답 관련으로 https://stackoverflow.com/a/13135425/1158895을 , std::thread
아직 모든 플랫폼에서 완전하지 않을 수 있습니다. 그럼에도 불구하고 (가까운 미래에도) pthread
응용 프로그램을 미래에 대비해야하기 때문에 선호해야합니다 .
boost::thread
Win64 또는 Bionic (Android)에서 사용해야 합니다 .Linux std::thread
에서는 여전히 std::thread
성숙해 보이는 부분이 부족 하기 때문 입니다 .
저에게 기술적 차이는 pthread와 달리 std에 신호 처리 프리미티브가 없다는 것입니다. std 만 사용하여 Unix 프로세스에서 신호 처리를 올바르게 지시 할 수없는 것은 AFAIK가 std :: thread를 사용하는 데있어 쇠약 한 결함입니다. 실을 끼 우고 나머지 부분을 막으십시오. pthreads를 사용하여 std :: thread를 구현한다고 가정하고 pthread_sigmask를 사용할 때 최상의 결과를 기대합니다. 기업을위한 Unix 시스템 프로그래밍에서 신호를 올바르게 처리하는 것은 협상이 불가능합니다.
2016 년에 std :: thread는 장난감입니다. 그렇게 간단합니다.
std::thread
pthread에는없는 유형 안전성을 제공합니다.
OpenMP
이미 10 년 이상 Linux 및 Windows에서 작업 해 온 표준화 된 SMP 기반 멀티 스레딩 표준입니다. OpenMP는 기본적으로 GCC 및 Microsoft Visual Studio를 포함한 모든 컴파일러에서 사용할 수 있습니다.
OpenMP를 사용할 때주의해야 할 사항은 CPU 코어보다 많은 스레드가 있으면 컨텍스트 전환 관련 오버 헤드로 인해 성능이 저하된다는 것입니다. 두 번째로 명심해야 할 것은 실제 운영 체제 수준의 스레드 초기화는 상대적으로 비싸다는 것입니다. 초기화는 1 초의 1 분의 1이지만, 일부 응용 프로그램에서는 매우 작은 부분이 상당한 비용으로 축적됩니다.
소프트웨어 아키텍처 요구 사항 관련 동시성 OpenMP를 사용하는 대신 "경량 스레드"또는 "녹색 스레드"의 일부 구현을 검색 할 수 있습니다. 차이점은 OpenMP 스레드는 실제 운영 체제 수준의 스레드이지만 "녹색 스레드"는 일부 실제 스레드를 사용하여 실행되는 "시뮬레이션 된 스레드"일 수 있다는 것입니다.
std::async