2012-11-08 63 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

相關問題