【问题标题】:boost thread bad access in Xcode在 Xcode 中提升线程错误访问
【发布时间】:2013-03-05 01:00:55
【问题描述】:

更新:如果我使用 libc++ 编译,则会出现错误,但是当我将编译器更改为 libstdc++(GNU C++ 标准库)时,程序将运行而不会显示任何错误。

我正在尝试一些来自 boost 网站的示例代码,但不知何故在运行此代码时我遇到了错误的访问错误。代码运行良好,直到它调用了它看起来的析构函数。

-lmysqlclient-lm-lz-lboost_date_time-lboost_system-lboost_filesystem已链接。

有谁知道我做错了什么?

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer
{
public:
    printer(boost::asio::io_service& io)
    : strand_(io),
    timer1_(io, boost::posix_time::seconds(1)),
    timer2_(io, boost::posix_time::seconds(1)),
    count_(0)
    {
        timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
        timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
    }

    ~printer()
    {
        std::cout << "Final count is " << count_ << "\n";
    }

    void print1()
    {
        if (count_ < 10)
        {
            std::cout << "Timer 1: " << count_ << "\n";
            ++count_;

            timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
            timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
        }
    }

    void print2()
    {
        if (count_ < 10)
        {
            std::cout << "Timer 2: " << count_ << "\n";
            ++count_;

            timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
            timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
        }
    }

private:
    boost::asio::strand strand_;
    boost::asio::deadline_timer timer1_;
    boost::asio::deadline_timer timer2_;
    int count_;
};

int main()
{
    boost::asio::io_service io;
    printer p(io);
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
    io.run();
    t.join();

    return 0;
}

Original image

我不确定这是否是堆栈跟踪...

【问题讨论】:

  • 当我在 VS 2010 中运行它时,没有访问冲突。奇数。
  • 在代码中看起来没有任何问题。当您仅链接所需的最小库子集时,您是否仍然会遇到访问冲突?
  • 附加一个调试器,并在您的程序接收到 BUS 或 SEGV 信号时向我们显示堆栈跟踪。
  • @DanNissenbaum 嗯,我读过它可能是因为 xcode.. 不过那会很糟糕,因为我主要在我的 mac 上编程。
  • Boost 的哪个版本?哪个版本的 Xcode?​​span>

标签: c++ xcode boost-asio boost-thread


【解决方案1】:

我使用 gcc 4.2.1 在我的 Mac 上构建并运行您的代码没有问题

samm$ g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
samm$ ./a.out
Timer 1: 0
Timer 2: 1
Timer 1: 2
Timer 2: 3
Timer 1: 4
Timer 2: 5
Timer 1: 6
Timer 2: 7
Timer 1: 8
Timer 2: 9
Final count is 10
samm$ 

我使用相同的工具链来构建我的 boost 库

samm$ grep BOOST_LIB_VERSION /opt/local/include/boost/version.hpp 
//  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
#define BOOST_LIB_VERSION "1_53"
samm$ 

我建议使用相同的工具链来构建 boost 和您的应用程序。

【讨论】:

  • 我刚刚使用了 boost 网站上的“教程”来构建 boost。我下载并安装了新的 Xcode 和命令行工具。然后我下载了 boost 1_53_0 并运行sudo ./bootstrap.sh --prefix=usr/local/ 并使用./b2 install 安装它。我没有改变任何东西,我在这里不知所措。我可以使用其他增强功能,但到目前为止只有“线程”给我一个错误。好想用boost来做定时器……
  • $ g++ --version i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ grep BOOST_LIB_VERSION /usr/local/include_64bit/boost/version.hpp // BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION #define BOOST_LIB_VERSION "1_53"
猜你喜欢
  • 2012-05-16
  • 2012-01-08
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多