2012-12-10 22 views
0

在試圖建立一個程序,它可以傳輸與提升async_write數據塊/陣列,我大概遇到了我的線程的麻煩:如何使用boosts io_service.post()來執行函數並使用數組或指針作爲參數?

這是我想執行什麼:

write(unsigned char *pMsg, unsigned short nMsgLen){ 
     io_service_.post(boost::bind(&m_client::write_buf, this, pMsg, nMsgLen)); 
} 

write_buf(unsigned char *pMsg, unsigned short nMsgLen){ 

      boost::asio::async_write(target, 
          boost::asio::buffer(pMsg, nMsgLen), 
          boost::bind(&m_client::write_buf_compl, 
          this, 
          boost::asio::placeholders::error)); 
} 

它編譯,但pMsg沒有正確的內容,當write_buf被調用時,我認爲這是因爲它被調用不在同一個線程內。

那麼,我怎麼能調整這個構造來傳遞我的數組作爲參數?!

+0

您必須確保在write_buf()被調用時,由'pMsg'指向的緩衝區將保持活動狀態。換句話說,如果該緩衝區對write()的調用者是本地的,那麼如果該函數將退出(並且變量持有緩衝區超出範圍),則會遇到麻煩。 – zaufi

+0

爲什麼這個問題被標記爲boost-thread? –

回答

0

看來你很明白你的問題在哪裏。快速修復它是通過複製其內容通過該緩衝區:

void write(unsigned char *pMsg, unsigned short nMsgLen) { 
    // TODO: Take care of exception safety... 
    char *pMsgCopy = (char *)malloc(nMsgLen); 
    memcpy(pMsgCopy, pMsg, nMsgLen); 
    io_service_.post(boost::bind(&m_client::write_buf, this, 
           pMsgCopy, nMsgLen)); 
} 

void write_buf(unsigned char *pMsg, unsigned short nMsgLen) 
{ 
    // Achtung! Don't forget to free memory in complection callback. 
    boost::asio::async_write(target, 
          boost::asio::buffer(pMsg, nMsgLen), 
          boost::bind(&m_client::write_buf_compl, 
             this, 
             boost::asio::placeholders::error)); 
} 

void write_buf_compl(...) 
{ 
    free(pMsg); 
} 

如果你是瘋狂的效率,那麼你可以通過具有write()呼叫者提供一個首位動態分配的緩衝區避免副本。但是,如果你真的對性能感到瘋狂,那麼我建議不要使用Boost.ASIO。不過那是另一回事了。

+0

更好地使用某種智能指針而不是原始指針。至少如果C++ 11是不允許的話,就像'std :: unique_ptr'或'boost :: shared_ptr'一樣 – zaufi