2015-11-18 9 views
5

Asio çerçevesinde oldukça yeniyim, lütfen nazik olun. Birkaç boost asio örneği incelenmiş ve insanlar böyle diyoruz zaman uyumsuz kullanmak tespit ettik:Yükseltme: zaman uyumsuz çağrılarda çoklu tekrarlama kullanmak güvenli midir?

void read() 
{ 
    async_read(socket_, boost::asio::buffer(&user_[0], user_.size()), 
     boost::bind(&Connection::handle_user_read, this, 
     placeholders::error, placeholders::bytes_transferred)); 
} 
void handle_user_read(...) 
{ 
    ... 
    read(); 
    ... 
} 

birden yineleme kullandığında çünkü bu kod güvenli olmadığını düşünüyorum. Bu nedenle, yığın yığın taşması nedeniyle çok sayıda okuma işlemi gerçekleştirildiğinde kullanılamaz. Bu konuda% 100 emin değilim ve diğer insanlardan benzer düşünceleri bulamıyorum.

Lütfen bunu ayrıntılı olarak açıklayabilir misiniz?

cevap

4

read() işlevinin I/O kuyruğuna yeni async okuma isteği eklediğini ve hemen çıkacağını varsayalım, bu nedenle bu kodda yineleme yok.

Yani, read() Connection :: handle_user_read doğrudan çağırmıyor. Sadece IO kuyruğundaki işlev göstericisini depolayın. Bazı yeni veri parçaları mevcut olduğunda, bu işlev harici kod tarafından eşzamansız olarak başlatılacaktır.

+0

: evet güvenlidir. Bu destek belgelerinde bunu yapmanın yolu budur. – Unda

+0

Teşekkürler, bunu düşünmedim. Şimdi tamamen açık. –