2

我正在用 boost::asio 编写一个 udp 广播服务器。udp 数据包将从一个源端接收并广播到多个目的地。在单个线程中执行此类操作是否安全?

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?

4

1 回答 1

0

文档说:

尽管缓冲区对象可以根据需要被复制,但底层内存块的所有权由调用者保留,它必须保证它们在调用处理程序之前保持有效。

如果缓冲区是在堆栈上分配的(即,它是在调用 async_send 的同一块中定义的)这很可能会被破坏。因为调用所以 async_send 不会阻塞,一旦你从这个代码片段返回,内存就会被释放。您可以将“缓冲区”设为类属性,以确保它在您需要时一直有效。但是如果缓冲区在堆上,那你就没事了,代码会照原样工作。

于 2012-11-08T22:38:25.780 回答