2012-11-23 2 views
2

이 게시물의 하단에있는 코드 3.3 잘 컴파일하지만,이 명령이스레딩 지원 ++ C++ 11

clang++ -std=c++11 -pthread -s -O3 -DNDEBUG source.cpp -o source 

바이너리 주어지면

$ clang++ -v 
clang version 3.3 (trunk 168461) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 

과 쓸모없는 바이너리를 생성 내가하지 않는 것은이

terminate called after throwing an instance of 'std::system_error' 
    what(): Operation not permitted 
Aborted (core dumped) 

항상 생성 :

  • C++ 11에 스레딩 모델이 표준으로 포함되어있는 경우 POSIX 스레드 라이브러리를 링크해야하는 이유는 무엇입니까? -std=c++11 플래그가 충분하지 않은 이유는 무엇입니까?
  • 그 소리가 ++ 나는 그것이의 pthreads에게

감사를 지원해야 읽은 내용에 따라, -pthread 여부를 지원하는 경우.

if (!__gthread_active_p()) 
    __throw_system_error(int(errc::operation_not_permitted)); 

당신을 위해 폭파 왜 이것은 --- 관하여 libgcc 검사에 대한 : thread.cc에서


#include <iostream> 
#include <thread> 

void f() 
{ 
    std::cout << "Hello World\n"; 
} 

int main() 
{ 
    std::thread t(f); 
    t.join(); 
} 
+1

clang을 사용할 때는 표준 라이브러리로 libC++를 사용해야합니다. 그냥 컴파일러 args에'-stdlib = libC++'를 추가하면된다. – inf

+0

@bamboon 예, 저는 이미 그를 시도해달라고 요청했습니다. – Ali

+2

libstdC++ (libC++ 아님)를 사용하는 경우 명령 줄에'-D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8'을 추가하려고 시도 했습니까? 상황이 개선되는지 확인하십시오. 배경 정보 [여기] (http://llvm.org/bugs/show_bug.cgi?id=12730). –

답변

0

스레드에서 다음과 같은 코드 : _는 M_start_thread()가 pthread_cancel()이 존재하고 존재하는 경우에만 1을 반환합니다. 당신은 -pthread를 지정하지 않았기 때문에 pthread_cancel()이 없습니다.

왜 건물을 만들 때 -pthread를 지정해야합니까? 나는 대체로 -pthread를 항상 가정하고 불필요한 오버 헤드를 발생시키기 때문에 그럴 것이라고 추측합니다.

+0

오버 헤드? 왜 ? 나는 내가 가져 오는 것을 선언하고 #include는 표준 명명 규칙의 일부입니다. 파서는 프로그램에서 필요로하는 모든 라이브러리를 요약하는 것이 현명하지 않습니까? 또한이 대답은 저를 납득시키지 않습니다. 모든 컴파일러는 표준 라이브러리를 자체적으로 구현해야하기 때문에 clang/llvm이 아닌 gcc에 대해 이야기하고 있기 때문입니다. 내 최고의 추측은 llvm C++이 아직 준비되지 않았고 gnu와 호환되지 않는다는 것입니다. – user1802174

+0

파서는 최종 바이너리에 포함 할 라이브러리를 결정하지 않습니다. 아마 ... 구현 자나 사용자 모두에게 눈물을 흘리게 될 것입니다. libgd는 libstdC++의 기본 스레드를 지원하는 라이브러리입니다. clang은 기본적으로 libgcc와 libstdC++에 모두 링크됩니다 (ldd 프로그램). 그러나 -pthread를 지정하면 libpthread에 대해서만 링크됩니다. – tmyklebu

0

코드를 컴파일 할 때 -pthread 플래그를 사용하면 큰 차이가 있습니다 (gcc - significance of -pthread flag when compiling 참조).

What is g++'s -pthread equiv in clang?에 대한 대답에 따르면 clang은 -pthread을 지원합니다.

Thread model: posix 

Pthreads won't go away을, 나는 매우 연타/LLVM은 처음부터 새 스레딩 라이브러리를 구현하는 것으로 의심 :


사실, 당신이 게시이 줄은의 pthreads를 사용하고 있는지 알려줍니다. 왜 그랬을까요? 플랫폼의 기본 라이브러리는 충분히 성숙했습니다. 내 컴퓨터에 설치 연타를 가지고 있지 않으며, 당신의 코드는 GCC 4.6 내 컴퓨터에서 잘 실행 :


죄송합니다, 나는이 함께 추가로 어떤 도움이되지 수 있습니다.

그 소리 ++ -std = C++ 11 -pthread -stdlib = 된 libstdC++

threadEx.cpp

당신은 라이브러리를 추가하는 것을 잊었다 :

+0

당신은 이것을 clang ++ 3.3으로 컴파일하고 당신의 컴퓨터에서 실행하려고 시도 했습니까? (리눅스를 가지고 있다면) – user1802174

+0

아니, 내 컴퓨터에 clang이 설치되어 있지 않다. 미안하다. – Ali

+0

또한 그냥 1-2 일 이전 svn에서 빌드를 가지고 있기 때문에 그 페이지에 대한 대답은 여기에 적용되지 않습니다. 이것은 이전 릴리스와 다를 수 있습니다 ... – user1802174

1

는이 같은 명령을 사용한다. libC++는 우분투 12.04, clang3.3 과 함께 작동하지 않지만 clang3.3 및 g ++ 4.7.2 (g ++ 4.6.3도 작동하지 않았다). 두 작품.