async_write()
被禁止從不同線程同時調用。它通過塊使用async_write_some
來發送數據,並且這樣的塊可以被交織。因此,用戶不必同時致電async_write()
。並行的async_write。有沒有等待解決方案?
有沒有比這個僞代碼更好的解決方案?
void send(shared_ptr<char> p) {
boost::mutex::scoped_lock lock(m_write_mutex);
async_write(p, handler);
}
我不喜歡這個主意,以阻止其他線程了相當長的時間(有50MB的〜在發送我的應用程序)。
可能是這樣的事情會工作?
void handler(const boost::system::error_code& e) {
if(!e) {
bool empty = lockfree_pop_front(m_queue);
if(!empty) {
shared_ptr<char> p = lockfree_queue_get_first(m_queue);
async_write(p, handler);
}
}
}
void send(shared_ptr<char> p) {
bool q_was_empty = lockfree_queue_push_back(m_queue, p)
if(q_was_empty)
async_write(p, handler);
}
我更願意找到一個隨時可以使用的食譜食譜。處理無鎖並不容易,會出現很多細微的錯誤。
假設傳輸儘可能快地運行,那麼交織來自多個線程的數據的優點是什麼?它不會加快總傳輸速率,並且線程平均不會更快完成。 – 2011-05-07 11:54:31
傳遞給async_write()的整個緩衝區必須作爲連續塊發送。它有一些結構。想象一下像http-answer一樣的標題和文件內容。如果有併發的async_write(),結構將會被破壞。 – user222202 2011-05-07 17:44:05
來自boost文檔: 此操作是通過對流的async_write_some函數的零個或多個調用實現的,稱爲合成操作。程序必須確保該流不會執行其他寫入操作(例如async_write,流的async_write_some函數或執行寫入的任何其他組合操作),直到此操作完成。 – user222202 2011-05-07 17:45:16