Panggilan Tulis Asynchronous Berjalin dalam Boost Asio
Dalam boost asio, panggilan async_write boleh bersilang jika berbilang mesej dihantar secara berturut-turut. Ini boleh membawa kepada tingkah laku yang tidak dijangka dan rasuah data. Untuk mengelakkan isu ini, penyelesaian mudah ialah mengekalkan baris gilir keluar untuk setiap pelanggan.
Menggunakan Baris Gilir Keluar
Dengan menggunakan baris gilir keluar, anda boleh memastikan bahawa mesej dihantar mengikut susunan yang diterima. Apabila mesej baharu tiba, ia ditambahkan pada baris gilir. Pengendali async_write menyemak saiz baris gilir dan memulakan operasi async_write baharu jika terdapat lebih banyak mesej untuk dihantar.
Contoh Pelaksanaan
Berikut ialah contoh pelaksanaan penulisan async pengendali yang menggunakan baris gilir keluar:
void writeHandler(const boost::system::error_code& error, const size_t bytesTransferred) { _outbox.pop_front(); if (error) { std::cerr << "could not write: " << boost::system::system_error(error).what() << std::endl; return; } if (!_outbox.empty()) { // more messages to send this->write(); } }
Dalam contoh ini, writeHandler memulakan operasi async_write baharu jika terdapat lebih banyak mesej dalam _outbox.
Melindungi Akses kepada Peti Keluar
Untuk melindungi akses kepada _outbox, anda harus menggunakan helai atau penyegerakan primitif. Sehelai memastikan bahawa hanya satu utas boleh melaksanakan kod yang mengakses _outbox pada satu-satu masa, menghalang keadaan perlumbaan.
Mata Utama
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Persilangan Panggilan Tulis Async dalam Boost Asio?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!