2012-11-23 101 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) 

我不明白的是:

  • 爲什麼我需要鏈接POSIX線程庫如果C++ 11在標準中包含線程模型,爲什麼標記-std=c++11還不夠?
  • 如果鐺++支持-pthread與否,根據我讀它應該支持並行線程

感謝。


#include <iostream> 
#include <thread> 

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

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

你應該使用鐺時使用的libC++標準庫。只需將'-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'?檢查它是否改善了這種情況。背景資料[here](http://llvm.org/bugs/show_bug.cgi?id=12730)。 –

回答

0

在thread.cc存在的代碼線以下位:: _ M_start_thread():

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

這就是爲什麼它炸燬了你--- libgcc的檢查pthread_cancel()的存在性,如果存在則返回1。你沒有指定-pthread,所以沒有pthread_cancel()。

爲什麼在構建時需要指定-pthread?我猜測這是因爲替代方案是假設-pthread所有的時間,這會導致不必要的開銷。

+0

開銷?爲什麼?我聲明瞭我正在導入的東西,並且#include它是標準命名約定的一部分,解析器不夠聰明,無法總結我的程序需要的所有庫?此外,這個答案並沒有說服我,因爲每個編譯器都應該有自己的標準庫實現,而且你正在談論的是gcc,而不是clang/llvm。我最好的猜測是,它的llvm C++還沒有準備好,它與gnu不兼容。 – user1802174

+0

解析器不會決定哪個庫包含在最終的二進制文件中,否。那可能會以實施者和用戶的眼淚結束。我在談論libgcc,它是一個支持底層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將從頭開始實現一個新的線程庫。他們爲什麼?該平臺的本地庫已經足夠成熟。


對不起,我幫不了你任何進一步:我沒有安裝我的機器上譁,你的代碼運行在我的機器上就好用gcc 4.6。

+0

你試過用clang ++ 3.3編譯這個並在你的機器上運行它? (如果你有linux) – user1802174

+0

不,我的機器上沒有安裝clang,對不起。 – Ali

+0

也在該頁上的答案不適用於這裏,因爲我有一個只有1-2天的svn構建,這不能是一箇舊的版本... – user1802174

1

你應該使用這樣的命令:

鐺++ -std = C++ 11 -pthread -stdlib = ++的libstdc threadEx.cpp

你忘了添加庫。 libC++不適用於我的Ubuntu 12.04,clang3.3 但我使它與clang3.3和g ++ 4.7.2(g ++ 4.6。3也沒有工作)。兩者都有效。