在io_service运行后创建套接字

时间:2014-06-12 12:17:10

标签: c++ sockets boost-asio

在使用boost的所有示例中,通常人们会执行以下操作

boost::asio::io_service io_service;
tcp::socket s1(io_service);
tcp::socket s2(io_service);
io_service.run();

但我正在编写已经在线程io_service中运行的类,并且必须使用此io_service创建套接字。还有我的问题。如何使其线程安全?

class MySocket
{
private:

    boost::asio::io_service* ioService;
    tcp::socket* socket;
public:
     MySocket(boost::asio::io_service* nioService,
              tcp::resolver::iterator endpoint_iterator):
    ioService(nioService)
    {
        socket = new tcp::socket(*ioService);
    }
     ~MySocket();
};

SocketHandler handler;
handler.run(); //run io_service in thread
MySocket* s1 = handler.createSocket("localhost", "80");
//do something
MySocket* s2 = handler.createSocket("localhost", "81");
//dododo
handler.destroySocket(s1);
handler.destroySocket(s2);

1 个答案:

答案 0 :(得分:1)

您可以随时使用boost :: asio创建新的套接字。

io_service::run()阻塞,直到工作队列为空。如果队列中没有工作 - 函数立即返回。这就是人们通常在io_service::run()之前为其添加工作(创建计时器,绑定套接字等)的原因。

顺便说一句:我不建议这样做:

MySocket* s1 = handler.createSocket("localhost", "80");
...
handler.destroySocket(s1);

使用RAII对象(智能指针)。