簡體   English   中英

Clang ++ 3.3對C ++ 11的線程支持

[英]threading support in Clang++ 3.3 for C++11

這篇文章底部的代碼可以正常編譯,但是會生成一個無用的二進制文件

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

當給出此命令時

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

二進制文件總是會產生這個

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

我不明白的是:

  • 如果C ++ 11在標准中包括線程模型,為什么我需要鏈接POSIX線程庫,為什么標志-std=c++11還不夠?
  • 如果clang ++是否支持-pthread ,根據我的閱讀,它應該支持pthreads

謝謝。


#include <iostream>
#include <thread>

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

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

您應該使用如下命令:

clang ++ -std = c ++ 11 -pthread -stdlib = libstdc ++ threadEx.cpp

您忘記添加庫。 libc ++在ubuntu 12.04,clang3.3上不適合我,但我在clang3.3和g ++ 4.7.2上使其起作用(g ++ 4.6.3也不起作用)。 兩者都可以。

在thread.cc中,thread :: _ M_start_thread()中包含以下代碼:

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

這就是為什么它給您帶來了麻煩--- libgcc檢查pthread_cancel()是否存在,如果存在則僅返回1。 您沒有指定-pthread,因此沒有pthread_cancel()。

為什么在構建時需要指定-pthread? 我猜這是因為替代方法是一直使用-pthread,這會導致不必要的開銷。

使用-pthread標志在編譯代碼時有很大的不同,請參見gcc-編譯時-pthread標志的含義

根據對問題的公認答案, 在clang中,g ++的-pthread等值是什么? ,clang支持 -pthread


實際上,您發布的這一行表明您正在使用pthreads:

Thread model: posix

Pthread不會消失 ,我高度懷疑Clang / LLVM是否將從頭開始實現新的線程庫。 他們為什么會呢? 該平台的本機庫已經足夠成熟。


抱歉,我無法進一步幫助您:我的計算機上沒有安裝clang,並且您的代碼在使用gcc 4.6的計算機上可以正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM