gpt4 book ai didi

c++ - boost::system::error_code::message() 使用 boost::asio 套接字抛出访问冲突异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:19 25 4
gpt4 key购买 nike

我正在实现一个必须与硬件设备建立少量套接字连接的客户端应用程序。我已将问题分解为以下小代码子集

boost::system::error_code ec;
std::string str_message = ec.message(); // no access violation before connect()
std::string str_port = "502";
std::string str_ip = "192.168.12.198";

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(),str_ip,str_port);
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::socket s(io_service);

ec = s.connect(*iterator,ec);
if (ec)
{
// connection error of some kind.
std::string str_debug = ec.message(); // BANG!!!!

}

我正在使用 Embarcadero RAD studio XE4 C++ Builder,当我在主 VCL 线程中运行上述代码时,它工作正常。当我使用多个连接运行它时,上面的代码在 TThread 类的多个实例中运行,这就是当我遇到访问冲突问题时 - 看起来当 error_code connect 调用修改, error_code 实例的内部成员 m_cat 变为 NULL,所以当我调用 message() 我得到了访问冲突。即使我只有一个后台线程在运行,也会发生这种情况。

有没有可能我上面的代码在我需要使用它的方式上根本不是线程安全的?我试图找出为什么这段代码不会在后台线程中运行,但找不到任何相关信息。

我运行的 boost 版本是 1.50,因为这是用于在 RAD studio 中构建 64 位应用程序的集成版本。

有没有其他人在多线程设置中(在 Embarcadero 或其他地方)遇到过这个问题?如果遇到过,您是如何解决的?或者这个类以多线程方式使用是不安全的?

最佳答案

这是一个远景,但可能值得一试:

system::error_code 由两个条目组成:一个错误值和一个类别。错误值基本上只是一个int,但类别是一个Singleton。 .这是必需的,因为根据指针标识比较错误类别是否相等(即,当且仅当它们指向相同类别对象时,两个类别相等)。

问题是类别 Singleton 的初始化可能不是线程安全的。 Asio 使用system_category,它在boost/libs/system/src/error_code.cpp 中实现。对于 1.50,实现如下所示:

BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT
{
static const system_error_category system_category_const;
return system_category_const;
}

这保证在符合 C++11 的编译器上是线程安全的,但是如果你的编译器没有实现 thread-safe initialization of function-scope statics ,这可能会中断。您可以通过跟踪对此函数的调用并查看是否观察到潜在的竞争来轻松验证这一点。

关于c++ - boost::system::error_code::message() 使用 boost::asio 套接字抛出访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com