Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Baris Keluar Setiap Pelanggan Boleh Menyelesaikan Async_write Interleaving dalam Boost Asio?
Async Writes dan Interaksi Pelanggan dalam boost asio
Dalam pengaturcaraan tak segerak menggunakan boost asio, mengurus interaksi klien serentak boleh menimbulkan cabaran. Khususnya, interleaving panggilan async_write boleh berlaku apabila berbilang pelanggan menghantar mesej dengan pantas.
Masalah: Interleaving Async Writes
Pertimbangkan senario di mana Pelanggan A menghantar mesej kepada Pelanggan B. Pelayan memproses mesej ini secara tidak segerak, membaca jumlah data yang ditentukan dan menunggu data selanjutnya daripada Klien A. Setelah maklumat diproses, pelayan menghantar respons kepada Klien B melalui async_write.
Walau bagaimanapun, jika Klien A menghantar mesej dengan pantas, operasi async_write untuk mesej ini mungkin berselang sebelum pengendali penyelesaian untuk mesej sebelumnya dipanggil.
Penyelesaian: Setiap Pelanggan Keluar Baris gilir
Untuk menangani isu ini, pertimbangkan untuk melaksanakan baris gilir keluar untuk setiap pelanggan. Dengan menyemak saiz baris gilir dalam pengendali penyelesaian async_write, pelayan boleh menentukan sama ada mesej tambahan tersedia untuk dihantar. Jika ya, ia mencetuskan operasi async_write yang lain.
Contoh Kod
Coretan kod berikut menggambarkan kemungkinan pelaksanaan menggunakan baris gilir Peti Keluar:
class Connection { public: ... private: void writeImpl(const std::string& message) { _outbox.push_back(message); if (_outbox.size() > 1) { // Outstanding async_write return; } this->write(); } void write() { ... // Asynchronous write operation } void writeHandler(const boost::system::error_code& error, const size_t bytesTransferred) { _outbox.pop_front(); if (error) { // Handle error ... } if (!_outbox.empty()) { // More messages to send this->write(); } } private: typedef std::deque<std::string> Outbox; private: boost::asio::io_service& _io_service; boost::asio::io_service::strand _strand; boost::asio::ip::tcp::socket _socket; Outbox _outbox; };
Kunci Mata
Dengan melaksanakan per-klien keluar baris gilir, anda boleh menghalang persilangan panggilan async_write dengan berkesan, memastikan mesej diproses mengikut susunan yang dimaksudkan.
Atas ialah kandungan terperinci Bagaimanakah Baris Keluar Setiap Pelanggan Boleh Menyelesaikan Async_write Interleaving dalam Boost Asio?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!