我正在实现一个客户端应用程序,该应用程序必须与硬件设备建立少量套接字连接。我已将问题分解为以下小代码子集
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
的内部成员变为 NULL,所以当我打电话时,我得到了访问冲突。即使我只有一个后台线程运行,也会发生这种情况。m_cat
error_code
message()
我上面的代码是否有可能在我需要使用它的方式上根本不是线程安全的?我试图找出为什么这段代码不会在后台线程中运行,但找不到任何关于它的信息。
我正在运行的 boost 版本是 1.50,因为这是用于在 RAD studio 中构建 64 位应用程序的集成版本。
有没有其他人在多线程设置(在 Embarcadero 或其他)中遇到过这个问题,如果是这样,你是如何解决的?或者这个类根本不安全地以多线程方式使用?