我已經使用boost :: asio套接字庫已有很多年了。但是,我遇到了一個奇怪的問題。我有一個班級不斷髮送數據到另一個進程。它從隊列中讀取數據,並將其發送,直到隊列變空。我已經從下面的例子中刪除了所有這些細節,以保持簡單。函數socket_write調用asio :: async_write,它在完成時調用writeHandler。我再次從處理程序調用socket_write函數。這在低音量下完美無缺。asio :: async_write處理程序在3秒後被調用
但是,在高容量情況下,事情變得很奇怪。首先,程序設法每秒執行100次socket_write操作。一分鐘左右後,writeHandler不會返回3秒。一旦它回來,另一個100週期在一秒鐘內通過。然後再次writeHandler不會返回3秒。一旦回來,另外100個週期拉回。
我是flummoxed!什麼能使writeHandler每秒返回100次,然後是3秒的延遲,並且每秒回到100次,然後是3秒的延遲?一旦開始,這是一個一致的模式。數據量不是太高,每寫操作不會發送超過幾百個字節。我也對接收服務器上的讀取操作進行了定時,讀取時間不會超過幾個毫秒。延遲僅在寫操作中。
class myclass
{
public:
// other stuff
void socket_write()
{
boost::asio::async_write(_socket,boost::asio::buffer(_writeVector),
boost::bind(&this_type::writeHandler, shared_from_this(),
pSession,boost::asio::placeholders::bytes_transferred,
boost::asio::placeholders::error));
}
void writeHandler(boost::shared_ptr<MessageSession> pSession, size_t bytesWritten, const boost::system::error_code& ec)
{
// stuff
socket_write(); // Call the socket_write function again.
}
};
這很奇怪,你可以用調試器檢查哪一行在'writeHandler'內部消耗了3秒鐘?它正在寫入哪個協議?如果它是一個流,它可能是緩衝區可能會變滿,但這是異步... –
不在寫處理程序。 writeHandler在我執行async_write()函數後3秒鐘被調用。它通常會在幾毫秒內回來。 – Sharath
嘗試一個調試器,直到有人遇到boost asio出現,3秒很多,所以調試器應該告訴你他們要去哪裏。 –