C++ 如何在叮当声中使用boost_线程?

C++ 如何在叮当声中使用boost_线程?,c++,boost,clang,boost-thread,clang++,C++,Boost,Clang,Boost Thread,Clang++,我在使用带有叮当声的boost_线程时遇到问题。新的Ubuntu 15.04版本的clang版本是3.6.0,boost版本是1.55.0。以前用于clang以前版本的程序现在在启动时会出现故障。当我改用g++时没有问题 下面是一个示例程序来说明这一点 #include <iostream> #include <boost/thread.hpp> using namespace std; void output() { try { int x = 0;

我在使用带有叮当声的boost_线程时遇到问题。新的Ubuntu 15.04版本的clang版本是3.6.0,boost版本是1.55.0。以前用于clang以前版本的程序现在在启动时会出现故障。当我改用g++时没有问题

下面是一个示例程序来说明这一点

#include <iostream>
#include <boost/thread.hpp>

using namespace std;

void output() {
  try {
    int x = 0;
    for (;;) {
      boost::this_thread::sleep(boost::posix_time::milliseconds(100));
      cerr << x++ << endl;
    }
  } catch (boost::thread_interrupted&) {}
}

int main(int argc, char* argv[]) {
  try {
    boost::thread output_worker(output);
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    output_worker.interrupt();
    output_worker.join();
  } catch (...) {
    cerr << "Unexpected error!" << endl;
    exit(1);
  }
}
如果我用叮当声编译它

clang++ thread.cpp -lboost_thread -lboost_system
我在下面的gdb跟踪中发现了一个SEGFULT

Starting program: /home/dejan/test/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd0580 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_>() ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
(gdb) bt
#0  0x00007ffff7bd0580 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_>() ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#1  0x00007ffff7bcb16a in ?? () from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#2  0x00007ffff7de95ba in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffdf98, env=env@entry=0x7fffffffdfa8)
   at dl-init.c:72
#3  0x00007ffff7de96cb in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:30
#4  _dl_init (main_map=0x7ffff7ffe188, argc=1, argv=0x7fffffffdf98, env=0x7fffffffdfa8) at dl-init.c:120
#5  0x00007ffff7dd9d0a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#6  0x0000000000000001 in ?? ()
#7  0x00007fffffffe2fe in ?? ()
#8  0x0000000000000000 in ?? ()
启动程序:/home/dejan/test/a.out
[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/lib/x86_64-linux-gnu/libthread_db.so.1”。
程序接收信号SIGSEGV,分段故障。
boost::exception\u ptr boost::exception\u detail::get\u static\u exception\u object()中的0x00007FF7BD0580
来自/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
(gdb)英国电信
#0 0x00007FF7BD0580在boost::exception_ptr boost::exception_detail::get_static_exception_object()中
来自/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#1 0x00007FF7BCB16A英寸??()来自/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#调用_init(l=,argc)中的2 0x00007ffff7de95ba=argc@entry=1,argv=argv@entry=0x7FFFFFDF98,环境=env@entry=0x7FFFFFDFA8)
在dl初始c时:72
#3 0x00007FF7DE96CB在dl init.c:30处的调用_init(env=,argv=,argc=,l=)中
#4 _dl_init(main_map=0x7ffff7ffe188,argc=1,argv=0x7fffffffdf98,env=0x7fffffffdfa8)在dl init.c:120处
#来自/lib64/ld-linux-x86-64.so.2的_dl_start_user()中的5 0x00007ffff7dd9d0a
#6 0x0000000000000001英寸??()
#7 0x00007FFFFFE2FE英寸??()
#8 0x0000000000000000英寸??()

我做错了什么吗?

使用
clang-std=c++11编译使boost改变了其内部实现,并实际解决了分段错误。

这不是一个理想的解决方案,但这是我使用代码的方式。

clang 3.6和boost 1.55之间可能存在兼容性问题。根据1.55的boost发行说明,它在3.3之前的版本中进行了测试。我在OSX上用Clang3.6和Boost1.58尝试了你的代码,它似乎工作得很好。为什么usw-std=c++11和std::thread不呢?最有可能的情况是,你可以在这里用std重命名boostcase@Ferruccio:更可能是
g++
clang++
之间不兼容,因为Ubuntu中的包通常是用
gcc
/
g++
编译的。请尝试添加
-pthread
选项。
Starting program: /home/dejan/test/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd0580 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_>() ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
(gdb) bt
#0  0x00007ffff7bd0580 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_>() ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#1  0x00007ffff7bcb16a in ?? () from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.55.0
#2  0x00007ffff7de95ba in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffdf98, env=env@entry=0x7fffffffdfa8)
   at dl-init.c:72
#3  0x00007ffff7de96cb in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:30
#4  _dl_init (main_map=0x7ffff7ffe188, argc=1, argv=0x7fffffffdf98, env=0x7fffffffdfa8) at dl-init.c:120
#5  0x00007ffff7dd9d0a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#6  0x0000000000000001 in ?? ()
#7  0x00007fffffffe2fe in ?? ()
#8  0x0000000000000000 in ?? ()