Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Baris Keluar Setiap Pelanggan Boleh Menyelesaikan Async_write Interleaving dalam Boost Asio?

Bagaimanakah Baris Keluar Setiap Pelanggan Boleh Menyelesaikan Async_write Interleaving dalam Boost Asio?

Linda Hamilton
Linda Hamiltonasal
2024-11-27 11:13:14284semak imbas

How Can Per-Client Outbound Queues Solve Async_write Interleaving in 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

  • Rancangan::asio::io_service::strand melindungi akses serentak kepada baris gilir Peti Keluar setiap pelanggan.
  • Kaedah write() digunakan daripada writeImpl() pengendali kerana ia adalah awam.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn