C++ std::thread::id'中的分段错误;s std::运算符==
我遇到了一个我不知道如何解决的问题。我认为这是GCC和/或libstdc++中的一个问题 我使用GCC4.8.2-19ubuntu1、libstdc++3.4.19(我相信?)和Boost1.55运行Ubuntu14.04LTS 代码如下:C++ std::thread::id'中的分段错误;s std::运算符==,c++,gcc,c++11,pthreads,static-linking,C++,Gcc,C++11,Pthreads,Static Linking,我遇到了一个我不知道如何解决的问题。我认为这是GCC和/或libstdc++中的一个问题 我使用GCC4.8.2-19ubuntu1、libstdc++3.4.19(我相信?)和Boost1.55运行Ubuntu14.04LTS 代码如下: // http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/tutorial.html // with a slight modification to ensure we're testing
// http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/tutorial.html
// with a slight modification to ensure we're testing with threads too
// g++ -g -O0 --std=c++11 staticlinktest.cpp -lboost_log_setup -lboost_log -lboost_system -lboost_filesystem -lboost_thread -lpthread
#define BOOST_ALL_DYN_LINK 1
#include <boost/log/trivial.hpp>
#include <thread>
#include <atomic>
#include <vector>
int main(int, char*[])
{
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
std::atomic<bool> exiting(false);
std::vector<std::thread> threads;
for ( int i = 0; i < 8; ++i ) {
threads.push_back(std::thread([&exiting](){
while (!exiting)
BOOST_LOG_TRIVIAL(trace) << "thread " << std::this_thread::get_id() << " trace";
}));
}
usleep(1000000);
exiting = true;
std::for_each(threads.begin(), threads.end(), [](std::thread& t){
t.join();
});
return 0;
}
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
int main(int, char*[])
{
std::atomic<bool> exiting(false);
std::vector<std::thread> threads;
for ( int i = 0; i < 8; ++i ) {
threads.push_back(std::thread([&exiting](){
while (!exiting)
std::cout << "thread " << std::this_thread::get_id() << " trace\n";
}));
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
exiting = true;
for(auto& t : threads){
t.join();
};
return 0;
}
//http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/tutorial.html
//稍加修改,以确保我们也在使用线程进行测试
//g++-g-O0--std=c++11 staticlinktest.cpp-lboost\u log\u设置-lboost\u log-lboost\u系统-lboost\u文件系统-lboost\u线程-lpthread
#定义BOOST_ALL_DYN_链接1
#包括
#包括
#包括
#包括
int main(int,char*[])
{
BOOST_LOG_triple(trace)将libpthread
静态链接到您的应用程序中是一个很好的选择。
然而,这里是如何做到这一点
我首先修复了编译错误(我怀疑您没有向我们展示实际编译的代码,或者boost污染了名称空间),然后删除了不相关的boost内容,这只会增加问题的噪声。下面是代码:
// http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/tutorial.html
// with a slight modification to ensure we're testing with threads too
// g++ -g -O0 --std=c++11 staticlinktest.cpp -lboost_log_setup -lboost_log -lboost_system -lboost_filesystem -lboost_thread -lpthread
#define BOOST_ALL_DYN_LINK 1
#include <boost/log/trivial.hpp>
#include <thread>
#include <atomic>
#include <vector>
int main(int, char*[])
{
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
std::atomic<bool> exiting(false);
std::vector<std::thread> threads;
for ( int i = 0; i < 8; ++i ) {
threads.push_back(std::thread([&exiting](){
while (!exiting)
BOOST_LOG_TRIVIAL(trace) << "thread " << std::this_thread::get_id() << " trace";
}));
}
usleep(1000000);
exiting = true;
std::for_each(threads.begin(), threads.end(), [](std::thread& t){
t.join();
});
return 0;
}
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
int main(int, char*[])
{
std::atomic<bool> exiting(false);
std::vector<std::thread> threads;
for ( int i = 0; i < 8; ++i ) {
threads.push_back(std::thread([&exiting](){
while (!exiting)
std::cout << "thread " << std::this_thread::get_id() << " trace\n";
}));
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
exiting = true;
for(auto& t : threads){
t.join();
};
return 0;
}
根据libstdc++
,如果使用线程和静态链接,则必须正确配置。以下是使其与静态链接一起工作的神奇标志:
g++ -std=c++11 -pedantic -pthread threads.cpp -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
正如我前面所说,将libpthread
静态链接到应用程序中会带来麻烦。“GCC和/或libstdc++中的问题”-虽然可能发生这种情况,但几乎从来都不是这样。总是先在自己的代码中查找问题。这就是我要寻求帮助的:)问题中的代码实际上是从我发送给同事的文件中完整复制/粘贴的,并且在这里编译得很好。尽管如此,很高兴知道将-lpthread包装在-whole-a中rchive似乎成功了。您提到的链接--enable tls;我认为这需要重建GCC?@inetknght是的,这意味着不幸地重建GCC。我想这也意味着如果我动态链接到pthreads,这个崩溃也会得到解决?@inetknght可能是的,这将是我的第一个猜测。在任何情况下,我都会链接到p动态线程。