我正在編寫一個程序,該程序將讀取的數據轉發給另一個對等設備。 我有一個方法,在每次讀取套接字上的數據後被調用。此方法將數據發佈到一個鏈中,以將其寫回另一個對等體。發送大塊數據時,應用程序發回的數據與收到的數據不一樣,問題是數據不再有序。這只是在boost :: asio :: io_service中使用多個線程的情況。即使在使用strand時,async_writes的排序也不正確
handleGatewayReply在某些數據在套接字上讀取時調用。 在這裏(1),在將數據寫入文件後,我可以看到數據仍然是有序的。 之後,postBackendReply被調用,數據仍然是有序的(2)。 但是在SessionConnection :: postReply中,如果我將數據刷新到文件(3),我可以看到數據不再被排序。 我看不出爲什麼訂單在此時丟失了,我試圖在handleGatewayReply和postBackendReply中使用一個鏈(如代碼所示),但行爲仍然相同。
對不起,我無法提交最小化,完整和可驗證的示例,因爲該錯誤太難以發現,需要多線程轉發大量數據。
void Reply::handleGatewayReply(std::stringstream* stream)
{
// Flush data to file (1)
m_strand.post(std::bind([=]() {
postBackendReply(*stream);
delete stream;
}
}));
}
void Reply::postBackendReply(const std::stringstream& stream)
{
auto buffer = std::make_shared<Buffer>();
buffer->m_buffers.push_back(stream.str());
// Flush data to file (2)
auto connection = m_request->connection();
if (connection) {
// connection->postReply(buffer); // doesn't work either
m_strand.post(std::bind(&SessionConnection::postReply, connection,buffer));
}
}
void SessionConnection::postReply(BufferPtr buffer)
{
// Flush data to file (3)
m_ioService.post(
m_ostrand.wrap(
std::bind(&SessionConnection::sendNext,
shared_from_this(), buffer)));
}
}
1.我從來沒有直接張貼處理程序io_service對象鑽進
io_service
任何其他的東西,我總是用鏈 2.每async_write處理程序已被包裝在一個鏈中 3.我試圖用調度來替換該文章,但同樣的問題。任何其他想法?爲什麼它在回覆:: postBackendReply中訂購(所以這裏沒有問題的訂單),但不是在postReply?這裏會發生什麼? –@BenD如果你不包裝你的處理程序,所有的訂購都是運氣。 –
@BenD在你的函數'postReply'中,你實際上發佈了一篇文章。訂單已不再保證。 –