2012-11-08 42 views
2

我正在写boost :: asio的udp广播服务器。 Udp数据包将从一个源端接收并广播到多个目的地。在单线程中做这样的事情是否安全?是否可以在一个udp套接字中发出多个async_send_to安全?

boost::asio::ip::udp::socket s; 
MyHandler handler; // do nothing handler 
MyBuffer buffer; // buffer is allocated on heap and managed by smart ptr 
... 

s.async_send_to(buffer, destination1, handler); 
s.async_send_to(buffer, destination2, handler); 
s.async_send_to(buffer, destination3, handler); 

或者我应该使用阻塞send_to?还是应该链接它们,即在第一个async_send_to的完成处理程序中调用第二个async_send_to?

回答

0

文档说:

虽然可以根据需要复制缓冲器对象,底层的存储块的所有权由呼叫者,必须保证它们保持有效,直到处理程序被调用保留。

如果缓冲区被分配到堆栈上(即它被定义在调用async_send的同一块中),这很可能被破坏。因为async_send的调用不会被阻塞,并且只要您从此代码片段返回,内存就会被释放。你可以使'缓冲'类属性,以确保它只要你需要它仍然有效。但是,如果缓冲区在堆上,那么你很好,代码将按原样运行。

+1

你说得对,但我在这里关心的不是缓冲区的生命周期(它被分配在堆上,并由引用计数的智能指针管理)。相反,我想确认在同一个UDP套接字上发出多个挂起的async_send_to操作是合法的,非法的还是未定义的行为?只要我知道,即使在单个线程中,在同一个TCP套接字上发出多个async_read操作也是不安全的,因为async_read是一个组合操作,因此接收到的底层数据可能会在多堆操作之间交织。 – user869210

相关问题