2011-12-22 2 views
1

현재 STD 라이브러리와 boost 라이브러리의 사용법을 포함하고있는 book을 읽고 있습니다. 문제는 Visual Studio 2010이 STD 스레드를 아직 지원하지 않기 때문에 우리는 boost 라이브러리에 의존해야한다는 것입니다.std 라이브러리 매핑을 라이브러리로 향상

따라서 하나의 매핑을위한 표준 스레드 라이브러리와 부스트 라이브러리를 찾고 있는데요. 참조 용으로 사용하는 리소스가 있습니까? 예를 들어

,

std::mutex 
std::thread 
std::lock_guard 
std::unique_ptr 
std::move 
std::thread::hardware_concurrency() 
std::thread::id 
std::this_thread 
std::shared_ptr   => boost::shared_ptr 
+0

인텔 스레딩 빌딩 블록을보고 싶습니다. 스레딩과 비슷하게 매우 높은 수준의 인터페이스를 제공하며, C++ 11 람다와도 잘 작동합니다. – smerlin

+1

@smerlin : 문제는 TBB가'std :: thread'와 매우 다르다는 것입니다. 그러나 boost :: thread는 대부분 비슷합니다. 나는 OP가 어떻게'std :: thread' 지식을 가능한 한 근접한 라이브러리에 적용 할 수 있는지 알고 싶어한다고 생각합니다. – ildjarn

+0

@ildjarn : 그렇습니다. 저는 TBB에 대해 언급하고 싶었습니다. 문제를 해결하기 위해 좀더 높은 수준의 접근 방식을 사용하는 것이 항상 낫기 때문입니다. 접근 방식이 상위 수준이기 때문에 문제가 해결되지 않으면 낮은 수준 영역에서 파기를 시작할 수 있습니다. TBB는 사용하기 쉽고 오픈 소스이며 학업 목적으로 무료입니다. – smerlin

답변

2

당신은

MSVC 2010 년 std::move, std::unique_ptr, std::shared_ptr 당신이 무료로 VC++11 Developer Preview를 사용할 수 있다는 것을 알고 있나요 사용할 수 있습니까? 그리고 거기에 STL 동기화 개체를 사용할 수 있습니다. 질문을 다음 boost::mutex의 동시성에 대한 Bartocz Milewski의 webinars에서보세요

당신이 볼 수있는 비교, boost::threadstd::mutex, std::threadIs it smart to replace boost::thread and boost::mutex with c++11 equivalents?

+0

프로젝트에서 VS 2010만을 사용할 수 있습니다. – q0987

+0

AFAIK Bartoscz Milewski는'std :: thread' 및 관련 클래스 (http://www.stdthread.co.uk/)의 구현에'just :: thread' 라이브러리를 사용합니다.). – smerlin

+0

@ 스머 린 : 예, 안녕하세요. 그러나 Milewski의 웹 세미나에서는 일반 VC++ 11을 사용하며 여전히 잘 작동합니다. VC++ 11과 C++ 11 사이에는 [차이점] (http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx)이 있습니다. –

2

부스트 스레드 라이브러리 (이었다 표준 스레드 라이브러리와 매우 유사하다 부스트 라이브러리에 기반); Boost에서는 그 중 일부가 mutex, thread, lock_guard, thread::hardware_concurrency()thread::id 목록에 포함되어 있다고 생각합니다.

나머지는 스레드 라이브러리의 일부가 아닙니다. 아마도 당신의 컴파일러는 라이브러리를 가지고 있지 않더라도 그것들을 가지고있을 것입니다.

boost::move의 구현이 있지만, 그들이 std::move처럼 동작하는지 확신 할 수 없습니다. 컴파일러가 지원하는 경우 사용해야합니다.

나는 boost::unique_ptr이 없다고 생각합니다. 을 사용하여 에뮬레이션 할 수 있으며, std::swap (또는 아마도 boost::move)을 사용하여 이동을 에뮬레이션 할 수 있습니다.

여러분이 말한 것처럼 boost::shared_ptrstd::shared_ptr과 매우 유사합니다.

+0

이것은 정확하게 내 관심사입니다. 두 라이브러리에서 두 개의 이름이 같을 때 동일한 이름을 수행하는 것은 아닙니다. – q0987

+0

std 네임 스페이스에 입력 된 부스트 기능이 완전히 동등하지 않습니다. C++ 11에 대한 부스트가 C++ 11에 대해 작성되었으며 C++ 11에 대해 새 STL이 작성되었습니다. C++ 03과 C++ 11은 다른 의미 체계를 제공합니다. hance std :: x는 boost :: x보다 강력합니다. –

2

boost :: thread와 클래스를 연관시킬 수 있습니다 (boost.org 참조).

그러나 VS2010은 C++ 11 컴파일러를 제공하는 반면 boost :: thread는 C++ 03에서 구현되었으며 정확히 일치하지는 않습니다. 두 언어는 "기능"의 용어가 다르며 라이브러리는 C++ 11보다 C++ 03의 기능을 활용할 수 있습니다.

이렇게하면 std :: shared_ptr (및 std :: unique_ptr)은 boost :: shared_ptr 및 std :: auto : _ptr을 선호 할 수 있습니다. 여기서 C++ 11 기능을 사용할 수 있습니다.

MS가 std :: thread 등을 지원하지 않는 이유 (그러나 GCC - MinGW의 Windows 버전에서도 마찬가지 임)는 std :: thread가 이전의 C POSIX pthread 기능을 포함하지만 windows- POSIX와 동등한 시스템이 아니며 특정 프리미티브를 지원하지 않습니다 (다른 것도 제공함).

MS는 Win6 (Vista)에서 POSIX 기능적으로 동등한 API를 제공하기 시작하여 매핑 작업을 가능하고 효과적으로 만듭니다. 하지만 std :: thread는 win5 + (XP/2 & 3)가 여전히 우세한 세계에서 win6 +에서만 사용할 수 있습니다.

지금 boost :: thread는 C++ 11에서 std :: thread가 된 것의 C++ 03 모방이며, POSIX (Unix/Linux) 및 Windows.

+0

나는'std :: thread'가 windows-xp에 구현 될 수 없다는 것을 매우 의문스럽게 생각합니다. 'std :: thread'의 어떤 기능이 pthreads api없이 효율적으로 구현 될 수 있습니까? – smerlin

+0

@ 스머 린 : 사실입니다. 윈도우의 문제는 condition_variable에 대해 완전한 동등한 기본 객체가 없다는 것입니다. Windows 이벤트 (CreateEvent 참조)는이를 모방 할 수 있지만 동일한 인스턴스 (notify_one 및 notify_all)에서 둘 다 변환 할 수 없습니다. C++ 표준 인터페이스는 Windows에서 구현할 수 있지만 Posix 시스템보다 복잡하고 (전용 인) 노력이 필요합니다. 따라서 Windows 프로그래머는 Posix를 모방하지 않고 Win32 기본 객체를 매핑하는 C++ 래퍼를 선호합니다. 그러나 이것은 다른 논리를 가진 프로그램으로 이어집니다. –

+0

네, 요점을 보았습니다.하지만 여전히 std :: thread'를 구현하기위한 기능이 필요하다고 생각하지 않습니다. 물론 효율적이지는 않지만'std :: condition_variable'을 구현할 수는 없지만 조건 변수를 사용하지 않고 C++ 11의 대부분의 다른 멀티 스레딩 기능을 구현할 수 있어야합니다. – smerlin