C++ std::thread::id'中的分段错误;s std::运算符==

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

我遇到了一个我不知道如何解决的问题。我认为这是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 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动态线程。